projects
/
ffmpeg.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
11a32d5
)
mxfdec: Fix some buffer overreads caused by the misuse of AVPacket related functions.
author
Alex Converse
<alex.converse@gmail.com>
Sat, 8 Oct 2011 01:41:06 +0000
(18:41 -0700)
committer
Alex Converse
<alex.converse@gmail.com>
Mon, 10 Oct 2011 16:40:26 +0000
(09:40 -0700)
libavformat/mxfdec.c
patch
|
blob
|
history
diff --git
a/libavformat/mxfdec.c
b/libavformat/mxfdec.c
index
8906bdd
..
d0a8a3a
100644
(file)
--- a/
libavformat/mxfdec.c
+++ b/
libavformat/mxfdec.c
@@
-224,12
+224,13
@@
static int mxf_get_d10_aes3_packet(AVIOContext *pb, AVStream *st, AVPacket *pkt,
if (length > 61444) /* worst case PAL 1920 samples 8 channels */
return -1;
if (length > 61444) /* worst case PAL 1920 samples 8 channels */
return -1;
- av_new_packet(pkt, length);
- avio_read(pb, pkt->data, length);
+ length = av_get_packet(pb, pkt, length);
+ if (length < 0)
+ return length;
data_ptr = pkt->data;
end_ptr = pkt->data + length;
buf_ptr = pkt->data + 4; /* skip SMPTE 331M header */
data_ptr = pkt->data;
end_ptr = pkt->data + length;
buf_ptr = pkt->data + 4; /* skip SMPTE 331M header */
- for (; buf_ptr < end_ptr; ) {
+ for (; buf_ptr
+ st->codec->channels*4
< end_ptr; ) {
for (i = 0; i < st->codec->channels; i++) {
uint32_t sample = bytestream_get_le32(&buf_ptr);
if (st->codec->bits_per_coded_sample == 24)
for (i = 0; i < st->codec->channels; i++) {
uint32_t sample = bytestream_get_le32(&buf_ptr);
if (st->codec->bits_per_coded_sample == 24)
@@
-239,7
+240,7
@@
static int mxf_get_d10_aes3_packet(AVIOContext *pb, AVStream *st, AVPacket *pkt,
}
buf_ptr += 32 - st->codec->channels*4; // always 8 channels stored SMPTE 331M
}
}
buf_ptr += 32 - st->codec->channels*4; // always 8 channels stored SMPTE 331M
}
-
pkt->size = data_ptr - pkt->data
;
+
av_shrink_packet(pkt, data_ptr - pkt->data)
;
return 0;
}
return 0;
}
@@
-291,12
+292,16
@@
static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv
if (memcmp(tmpbuf, checkv, 16))
av_log(s, AV_LOG_ERROR, "probably incorrect decryption key\n");
size -= 32;
if (memcmp(tmpbuf, checkv, 16))
av_log(s, AV_LOG_ERROR, "probably incorrect decryption key\n");
size -= 32;
- av_get_packet(pb, pkt, size);
+ size = av_get_packet(pb, pkt, size);
+ if (size < 0)
+ return size;
+ else if (size < plaintext_size)
+ return AVERROR_INVALIDDATA;
size -= plaintext_size;
if (mxf->aesc)
av_aes_crypt(mxf->aesc, &pkt->data[plaintext_size],
&pkt->data[plaintext_size], size >> 4, ivec, 1);
size -= plaintext_size;
if (mxf->aesc)
av_aes_crypt(mxf->aesc, &pkt->data[plaintext_size],
&pkt->data[plaintext_size], size >> 4, ivec, 1);
-
pkt->size = orig_size
;
+
av_shrink_packet(pkt, orig_size)
;
pkt->stream_index = index;
avio_skip(pb, end - avio_tell(pb));
return 0;
pkt->stream_index = index;
avio_skip(pb, end - avio_tell(pb));
return 0;
@@
-333,8
+338,11
@@
static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n");
return -1;
}
av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n");
return -1;
}
- } else
- av_get_packet(s->pb, pkt, klv.length);
+ } else {
+ int ret = av_get_packet(s->pb, pkt, klv.length);
+ if (ret < 0)
+ return ret;
+ }
pkt->stream_index = index;
pkt->pos = klv.offset;
return 0;
pkt->stream_index = index;
pkt->pos = klv.offset;
return 0;