History

avformat/mxfdec: Check klv offset

Fixes: Assertion klv_offset >= mxf->run_in failed at libavformat/mxfdec.c:736 Fixes: 62936/clusterfuzz-testcase-minimized-ffmpeg_dem_MXF_fuzzer-5778404366221312.fuzz

Michael Niedermayer committed 3 years ago

Commit 70f5fa61 parent 644b2231 file · +8 −5Browse files

Unified · Split

libavformat/mxfdec.c+8−5
@@ -458,12 +458,15 @@ static int mxf_read_sync(AVIOContext *pb, const uint8_t *key, unsigned size) · 457 unmodified lines
458458 return i == size;
459459 }
460460
461−static int klv_read_packet(KLVPacket *klv, AVIOContext *pb)
461+static int klv_read_packet(MXFContext *mxf, KLVPacket *klv, AVIOContext *pb)
462462 {
463463 int64_t length, pos;
464464 if (!mxf_read_sync(pb, mxf_klv_key, 4))
465465 return AVERROR_INVALIDDATA;
466466 klv->offset = avio_tell(pb) - 4;
467+ if (klv->offset < mxf->run_in)
468+ return AVERROR_INVALIDDATA;
469+
467470 memcpy(klv->key, mxf_klv_key, 4);
468471 avio_read(pb, klv->key + 4, 12);
469472 length = klv_decode_ber_length(pb);
@@ -3435,7 +3438,7 @@ static int mxf_seek_to_previous_partition(MXFContext *mxf) · 2965 unmodified lines
34353438 /* Make sure this is actually a PartitionPack, and if so parse it.
34363439 * See deadlock2.mxf
34373440 */
3438− if ((ret = klv_read_packet(&klv, pb)) < 0) {
3441+ if ((ret = klv_read_packet(mxf, &klv, pb)) < 0) {
34393442 av_log(mxf->fc, AV_LOG_ERROR, "failed to read PartitionPack KLV\n");
34403443 return ret;
34413444 }
@@ -3712,7 +3715,7 @@ static void mxf_read_random_index_pack(AVFormatContext *s) · 270 unmodified lines
37123715 if (length < min_rip_length || length > max_rip_length)
37133716 goto end;
37143717 avio_seek(s->pb, file_size - length, SEEK_SET);
3715− if (klv_read_packet(&klv, s->pb) < 0 ||
3718+ if (klv_read_packet(mxf, &klv, s->pb) < 0 ||
37163719 !IS_KLV_KEY(klv.key, ff_mxf_random_index_pack_key))
37173720 goto end;
37183721 if (klv.next_klv != file_size || klv.length <= 4 || (klv.length - 4) % 12) {
@@ -3759,7 +3762,7 @@ static int mxf_read_header(AVFormatContext *s) · 40 unmodified lines
37593762 while (!avio_feof(s->pb)) {
37603763 const MXFMetadataReadTableEntry *metadata;
37613764
3762− ret = klv_read_packet(&klv, s->pb);
3765+ ret = klv_read_packet(mxf, &klv, s->pb);
37633766 if (ret < 0 || IS_KLV_KEY(klv.key, ff_mxf_random_index_pack_key)) {
37643767 if (ret >= 0 && avio_size(s->pb) > klv.next_klv)
37653768 av_log(s, AV_LOG_WARNING, "data after the RandomIndexPack, assuming end of file\n");
@@ -4011,7 +4014,7 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) · 245 unmodified lines
40114014
40124015 if (pos < mxf->current_klv_data.next_klv - mxf->current_klv_data.length || pos >= mxf->current_klv_data.next_klv) {
40134016 mxf->current_klv_data = (KLVPacket){{0}};
4014− ret = klv_read_packet(&klv, s->pb);
4017+ ret = klv_read_packet(mxf, &klv, s->pb);
40154018 if (ret < 0)
40164019 break;
40174020 max_data_size = klv.length;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t