diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2007-10-13 09:58:39 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2007-10-13 09:58:39 +0000 |
commit | 211dd1e81f3cbf3e4dd0cfad810bb4ba1362956d (patch) | |
tree | 2c1e6370330a586ad63d1c5ae12b28541c705432 | |
parent | 0d43dd8c2d1e8dc7cf0bc65b95b7612cbe01c060 (diff) | |
download | ffmpeg-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.c | 21 |
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; |