summaryrefslogtreecommitdiff
path: root/libavformat/nutdec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2008-05-27 20:48:27 +0000
committerMichael Niedermayer <michaelni@gmx.at>2008-05-27 20:48:27 +0000
commitc2a3dcaf25e5771acd7f38a3a5e768e160cdc3d7 (patch)
treea57e40064bf92c050513047d3883c87dc02cd2f9 /libavformat/nutdec.c
parent8e6f8869ab371e676e7c22db986bbd321d34e1c3 (diff)
Fix memleak, fixed CID123.
Originally committed as revision 13472 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/nutdec.c')
-rw-r--r--libavformat/nutdec.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c
index 0655d0fdc7..fd7c893490 100644
--- a/libavformat/nutdec.c
+++ b/libavformat/nutdec.c
@@ -500,6 +500,7 @@ static int find_and_decode_index(NUTContext *nut){
int64_t filesize= url_fsize(bc);
int64_t *syncpoints;
int8_t *has_keyframe;
+ int ret= -1;
url_fseek(bc, filesize-12, SEEK_SET);
url_fseek(bc, filesize-get_be64(bc), SEEK_SET);
@@ -516,7 +517,9 @@ static int find_and_decode_index(NUTContext *nut){
syncpoints= av_malloc(sizeof(int64_t)*syncpoint_count);
has_keyframe= av_malloc(sizeof(int8_t)*(syncpoint_count+1));
for(i=0; i<syncpoint_count; i++){
- GET_V(syncpoints[i], tmp>0)
+ syncpoints[i] = ff_get_v(bc);
+ if(syncpoints[i] <= 0)
+ goto fail;
if(i)
syncpoints[i] += syncpoints[i-1];
}
@@ -533,7 +536,7 @@ static int find_and_decode_index(NUTContext *nut){
x>>=1;
if(n+x >= syncpoint_count + 1){
av_log(s, AV_LOG_ERROR, "index overflow A\n");
- return -1;
+ goto fail;
}
while(x--)
has_keyframe[n++]= flag;
@@ -542,7 +545,7 @@ static int find_and_decode_index(NUTContext *nut){
while(x != 1){
if(n>=syncpoint_count + 1){
av_log(s, AV_LOG_ERROR, "index overflow B\n");
- return -1;
+ goto fail;
}
has_keyframe[n++]= x&1;
x>>=1;
@@ -550,7 +553,7 @@ static int find_and_decode_index(NUTContext *nut){
}
if(has_keyframe[0]){
av_log(s, AV_LOG_ERROR, "keyframe before first syncpoint in index\n");
- return -1;
+ goto fail;
}
assert(n<=syncpoint_count+1);
for(; j<n && j<syncpoint_count; j++){
@@ -577,9 +580,13 @@ static int find_and_decode_index(NUTContext *nut){
if(skip_reserved(bc, end) || get_checksum(bc)){
av_log(s, AV_LOG_ERROR, "index checksum mismatch\n");
- return -1;
+ goto fail;
}
- return 0;
+ ret= 0;
+fail:
+ av_free(syncpoints);
+ av_free(has_keyframe);
+ return ret;
}
static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)