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:
parent
8e6f8869ab
commit
c2a3dcaf25
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user