1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

Fix memleak, fixed CID123.

Originally committed as revision 13472 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2008-05-27 20:48:27 +00:00
parent 8e6f8869ab
commit c2a3dcaf25

View File

@ -500,6 +500,7 @@ static int find_and_decode_index(NUTContext *nut){
int64_t filesize= url_fsize(bc); int64_t filesize= url_fsize(bc);
int64_t *syncpoints; int64_t *syncpoints;
int8_t *has_keyframe; int8_t *has_keyframe;
int ret= -1;
url_fseek(bc, filesize-12, SEEK_SET); url_fseek(bc, filesize-12, SEEK_SET);
url_fseek(bc, filesize-get_be64(bc), 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); syncpoints= av_malloc(sizeof(int64_t)*syncpoint_count);
has_keyframe= av_malloc(sizeof(int8_t)*(syncpoint_count+1)); has_keyframe= av_malloc(sizeof(int8_t)*(syncpoint_count+1));
for(i=0; i<syncpoint_count; i++){ 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) if(i)
syncpoints[i] += syncpoints[i-1]; syncpoints[i] += syncpoints[i-1];
} }
@ -533,7 +536,7 @@ static int find_and_decode_index(NUTContext *nut){
x>>=1; x>>=1;
if(n+x >= syncpoint_count + 1){ if(n+x >= syncpoint_count + 1){
av_log(s, AV_LOG_ERROR, "index overflow A\n"); av_log(s, AV_LOG_ERROR, "index overflow A\n");
return -1; goto fail;
} }
while(x--) while(x--)
has_keyframe[n++]= flag; has_keyframe[n++]= flag;
@ -542,7 +545,7 @@ static int find_and_decode_index(NUTContext *nut){
while(x != 1){ while(x != 1){
if(n>=syncpoint_count + 1){ if(n>=syncpoint_count + 1){
av_log(s, AV_LOG_ERROR, "index overflow B\n"); av_log(s, AV_LOG_ERROR, "index overflow B\n");
return -1; goto fail;
} }
has_keyframe[n++]= x&1; has_keyframe[n++]= x&1;
x>>=1; x>>=1;
@ -550,7 +553,7 @@ static int find_and_decode_index(NUTContext *nut){
} }
if(has_keyframe[0]){ if(has_keyframe[0]){
av_log(s, AV_LOG_ERROR, "keyframe before first syncpoint in index\n"); av_log(s, AV_LOG_ERROR, "keyframe before first syncpoint in index\n");
return -1; goto fail;
} }
assert(n<=syncpoint_count+1); assert(n<=syncpoint_count+1);
for(; j<n && j<syncpoint_count; j++){ 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)){ if(skip_reserved(bc, end) || get_checksum(bc)){
av_log(s, AV_LOG_ERROR, "index checksum mismatch\n"); 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) static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)