]> git.sesse.net Git - ffmpeg/commitdiff
fftools/ffmpeg_opt: Check attachment filesize
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Wed, 15 Apr 2020 18:54:42 +0000 (20:54 +0200)
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Thu, 16 Apr 2020 23:34:07 +0000 (01:34 +0200)
The data of an attachment file is put into an AVCodecParameter's
extradata. The corresponding size field has type int, yet there was no
check for the size to fit into an int. As a consequence, it was possible
to create extradata with negative size (by using a big enough max_alloc).

Other errors were also possible: If SIZE_MAX < INT64_MAX (e.g. on 32bit
systems) then the file size might be truncated before the allocation;
and avio_read() takes an int, too, so one would not have read as much
as one desired.

Furthermore, the extradata is now padded as is required.

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
fftools/ffmpeg_opt.c

index 93b3d96205de3845bfd67ecba5f2c214707bdad5..680f0f1dfb73e55779bafed6a55a3f18a6be1edf 100644 (file)
@@ -2432,12 +2432,14 @@ loop_end:
                    o->attachments[i]);
             exit_program(1);
         }
-        if (!(attachment = av_malloc(len))) {
-            av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
+        if (len > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE ||
+            !(attachment = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE))) {
+            av_log(NULL, AV_LOG_FATAL, "Attachment %s too large.\n",
                    o->attachments[i]);
             exit_program(1);
         }
         avio_read(pb, attachment, len);
+        memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 
         ost = new_attachment_stream(o, oc, -1);
         ost->stream_copy               = 0;