aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2007-10-13 09:58:39 +0000
committerMichael Niedermayer <michaelni@gmx.at>2007-10-13 09:58:39 +0000
commit211dd1e81f3cbf3e4dd0cfad810bb4ba1362956d (patch)
tree2c1e6370330a586ad63d1c5ae12b28541c705432
parent0d43dd8c2d1e8dc7cf0bc65b95b7612cbe01c060 (diff)
downloadffmpeg-211dd1e81f3cbf3e4dd0cfad810bb4ba1362956d.tar.gz
factorize code and add safety check to prevent memcpying negative amounts
Originally committed as revision 10722 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/aac_ac3_parser.c21
1 files changed, 8 insertions, 13 deletions
diff --git a/libavcodec/aac_ac3_parser.c b/libavcodec/aac_ac3_parser.c
index b07f93acf0..fc6249ede4 100644
--- a/libavcodec/aac_ac3_parser.c
+++ b/libavcodec/aac_ac3_parser.c
@@ -37,16 +37,18 @@ int ff_aac_ac3_parse(AVCodecParserContext *s1,
buf_ptr = buf;
while (buf_size > 0) {
+ int size_needed= s->frame_size ? s->frame_size : s->header_size;
len = s->inbuf_ptr - s->inbuf;
- if (s->frame_size == 0) {
- /* no header seen : find one. We need at least s->header_size
- bytes to parse it */
- len = FFMIN(s->header_size - len, buf_size);
+ if(len<size_needed){
+ len = FFMIN(size_needed - len, buf_size);
memcpy(s->inbuf_ptr, buf_ptr, len);
- buf_ptr += len;
+ buf_ptr += len;
s->inbuf_ptr += len;
- buf_size -= len;
+ buf_size -= len;
+ }
+
+ if (s->frame_size == 0) {
if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
&samples);
@@ -71,13 +73,6 @@ int ff_aac_ac3_parse(AVCodecParserContext *s1,
}
}
} else {
- len = FFMIN(s->frame_size - len, buf_size);
-
- memcpy(s->inbuf_ptr, buf_ptr, len);
- buf_ptr += len;
- s->inbuf_ptr += len;
- buf_size -= len;
-
if(s->inbuf_ptr - s->inbuf == s->frame_size){
*poutbuf = s->inbuf;
*poutbuf_size = s->frame_size;