Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Subject: [FFmpeg-devel] [PATCH 03/15] avformat/fitsdec: Don't use AVBPrint for temporary storage
Date: Sat, 23 Mar 2024 03:06:11 +0100
Message-ID: <GV1P250MB07377A2051FBAD7B79EAD5128F302@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <GV1P250MB07376CBB2E248FDF0C78CF8C8F302@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM>

Most of the data in the temporary storage ends up being
returned to the user as AVPacket.data, so it makes sense
to avoid using the AVBPrint for temporary storage altogether
(in particular in light of the fact that the blocks read here
are too big for the small-string optimization anyway) and
read the data directly into AVPacket.data. This also avoids
another memcpy() from a stack buffer to the AVBPrint in ts_image()
(that could always have been avoided with av_bprint_get_buffer()).

These changes also allow to use av_append_packet(), which
greatly simplifies the code; furthermore, one can avoid cleanup
code on error as the packet is already unreferenced generically
on error.

There are two user-visible changes from this patch:
1. Truncated packets are now marked as corrupt.
2. AVPacket.pos is set (it corresponds to the discarded header
line, 80 bytes before the position corresponding to the
actual packet data).

Furthermore, this patch also removes code that triggered
a -Wtautological-constant-out-of-range-compare warning
from Clang (namely a comparison of an unsigned and INT64_MAX
in an assert).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavformat/fitsdec.c | 80 ++++++++++++++-----------------------------
 1 file changed, 25 insertions(+), 55 deletions(-)

diff --git a/libavformat/fitsdec.c b/libavformat/fitsdec.c
index fe2dd5ad5d..6771dda327 100644
--- a/libavformat/fitsdec.c
+++ b/libavformat/fitsdec.c
@@ -24,13 +24,10 @@
  * FITS demuxer.
  */
 
-#include "libavutil/avassert.h"
-#include "libavutil/intreadwrite.h"
 #include "demux.h"
 #include "internal.h"
 #include "libavutil/opt.h"
 #include "libavcodec/fits.h"
-#include "libavutil/bprint.h"
 
 #define FITS_BLOCK_SIZE 2880
 
@@ -71,31 +68,31 @@ static int fits_read_header(AVFormatContext *s)
  * @param s pointer to AVFormat Context
  * @param fits pointer to FITSContext
  * @param header pointer to FITSHeader
- * @param avbuf pointer to AVBPrint to store the header
+ * @param pkt pointer to AVPacket to store the header
  * @param data_size to store the size of data part
- * @return 1 if image found, 0 if any other extension and AVERROR_INVALIDDATA otherwise
+ * @return 1 if image found, 0 if any other extension and AVERROR code otherwise
  */
-static int64_t is_image(AVFormatContext *s, FITSContext *fits, FITSHeader *header,
-                         AVBPrint *avbuf, uint64_t *data_size)
+static int is_image(AVFormatContext *s, FITSContext *fits, FITSHeader *header,
+                    AVPacket *pkt, uint64_t *data_size)
 {
     int i, ret, image = 0;
-    char buf[FITS_BLOCK_SIZE] = { 0 };
-    int64_t buf_size = 0, size = 0, t;
+    int64_t size = 0, t;
 
     do {
-        ret = avio_read(s->pb, buf, FITS_BLOCK_SIZE);
+        const uint8_t *buf, *buf_end;
+        ret = av_append_packet(s->pb, pkt, FITS_BLOCK_SIZE);
         if (ret < 0) {
             return ret;
         } else if (ret < FITS_BLOCK_SIZE) {
             return AVERROR_INVALIDDATA;
         }
 
-        av_bprint_append_data(avbuf, buf, FITS_BLOCK_SIZE);
         ret = 0;
-        buf_size = 0;
-        while(!ret && buf_size < FITS_BLOCK_SIZE) {
-            ret = avpriv_fits_header_parse_line(s, header, buf + buf_size, NULL);
-            buf_size += 80;
+        buf_end = pkt->data + pkt->size;
+        buf     = buf_end - FITS_BLOCK_SIZE;
+        while(!ret && buf < buf_end) {
+            ret = avpriv_fits_header_parse_line(s, header, buf, NULL);
+            buf += 80;
         }
     } while (!ret);
     if (ret < 0)
@@ -142,12 +139,10 @@ static int64_t is_image(AVFormatContext *s, FITSContext *fits, FITSHeader *heade
 
 static int fits_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
-    int64_t pos, ret;
     uint64_t size;
     FITSContext *fits = s->priv_data;
     FITSHeader header;
-    AVBPrint avbuf;
-    char *buf;
+    int ret;
 
     if (fits->first_image) {
         avpriv_fits_header_init(&header, STATE_SIMPLE);
@@ -155,57 +150,32 @@ static int fits_read_packet(AVFormatContext *s, AVPacket *pkt)
         avpriv_fits_header_init(&header, STATE_XTENSION);
     }
 
-    av_bprint_init(&avbuf, FITS_BLOCK_SIZE, AV_BPRINT_SIZE_UNLIMITED);
-    while ((ret = is_image(s, fits, &header, &avbuf, &size)) == 0) {
-        av_bprint_finalize(&avbuf, NULL);
-        pos = avio_skip(s->pb, size);
+    while ((ret = is_image(s, fits, &header, pkt, &size)) == 0) {
+        int64_t pos = avio_skip(s->pb, size);
         if (pos < 0)
             return pos;
 
-        av_bprint_init(&avbuf, FITS_BLOCK_SIZE, AV_BPRINT_SIZE_UNLIMITED);
         avpriv_fits_header_init(&header, STATE_XTENSION);
+        av_packet_unref(pkt);
     }
     if (ret < 0)
-        goto fail;
-
-    if (!av_bprint_is_complete(&avbuf)) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
-
-    av_assert0(avbuf.len <= INT64_MAX && size <= INT64_MAX);
-    if (avbuf.len + size > INT_MAX - 80)  {
-        ret = AVERROR_INVALIDDATA;
-        goto fail;
-    }
-    // Header is sent with the first line removed...
-    ret = av_new_packet(pkt, avbuf.len - 80 + size);
-    if (ret < 0)
-        goto fail;
+        return ret;
 
     pkt->stream_index = 0;
-    pkt->flags |= AV_PKT_FLAG_KEY;
+    pkt->flags       |= AV_PKT_FLAG_KEY;
+    pkt->duration     = 1;
+    // Header is sent with the first line removed...
+    pkt->data        += 80;
+    pkt->size        -= 80;
 
-    ret = av_bprint_finalize(&avbuf, &buf);
-    if (ret < 0) {
-        return ret;
-    }
+    if (size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - pkt->size)
+        return AVERROR(ERANGE);
 
-    memcpy(pkt->data, buf + 80, avbuf.len - 80);
-    pkt->size = avbuf.len - 80;
-    av_freep(&buf);
-    ret = avio_read(s->pb, pkt->data + pkt->size, size);
+    ret = av_append_packet(s->pb, pkt, size);
     if (ret < 0)
         return ret;
 
-    pkt->size += ret;
-    pkt->duration = 1;
-
     return 0;
-
-fail:
-    av_bprint_finalize(&avbuf, NULL);
-    return ret;
 }
 
 static const AVOption fits_options[] = {
-- 
2.40.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2024-03-23  2:06 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-23  2:03 [FFmpeg-devel] [PATCH 01/15] configure: Make hls demuxer select AAC, AC3 and EAC3 demuxers Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 02/15] avformat/hls: Don't access FFInputFormat.raw_codec_id Andreas Rheinhardt
2024-03-23  2:06 ` Andreas Rheinhardt [this message]
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 04/15] avformat/g722: Inline constants Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 05/15] avformat/wvedec: Inline constant Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 06/15] avformat/fsb: Don't set data_offset manually Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 07/15] avformat/avr: Combine skips Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 08/15] avformat/wady: " Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 09/15] avformat/argo_cvg: Avoid relocations for ArgoCVGOverride Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 10/15] avformat/lafdec: Fix shadowing Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 11/15] avformat/cdg: Don't store avio_size() return value in int Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 12/15] avformat/pcmdec: Avoid av_freep(&(void*){NULL}) Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 13/15] avformat/pcmdec: Reindent after the previous commit Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 14/15] avformat/vqf: Return 0 on success in read_packet Andreas Rheinhardt
2024-03-23  2:06 ` [FFmpeg-devel] [PATCH 15/15] avformat/internal: Move FF_FMT_INIT_CLEANUP to demux.h Andreas Rheinhardt
2024-03-25  1:54 ` [FFmpeg-devel] [PATCH 01/15] configure: Make hls demuxer select AAC, AC3 and EAC3 demuxers Andreas Rheinhardt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=GV1P250MB07377A2051FBAD7B79EAD5128F302@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM \
    --to=andreas.rheinhardt@outlook.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git