mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
avformat/mov: Fix memleaks upon read_header failure
By default, a demuxer's read_close function is not called automatically if an error happens when reading the header; instead it is up to the demuxer to clean up after itself in this case. The mov demuxer did this by calling its read_close function when it encountered some errors when reading the header. Yet for other errors (mostly adding side-data to streams) this has been forgotten, so that all the internal structures of the demuxer leak. This commit fixes this by making sure mov_read_close is called when necessary. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> (cherry picked from commit ac378c535be907ee383dafb430be7216a2920982) Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
13796b5406
commit
85200b8c02
@ -6824,14 +6824,13 @@ static int mov_read_header(AVFormatContext *s)
|
||||
avio_seek(pb, 0, SEEK_SET);
|
||||
if ((err = mov_read_default(mov, pb, atom)) < 0) {
|
||||
av_log(s, AV_LOG_ERROR, "error reading header\n");
|
||||
mov_read_close(s);
|
||||
return err;
|
||||
goto fail;
|
||||
}
|
||||
} while ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mov->found_moov && !mov->moov_retry++);
|
||||
if (!mov->found_moov) {
|
||||
av_log(s, AV_LOG_ERROR, "moov atom not found\n");
|
||||
mov_read_close(s);
|
||||
return AVERROR_INVALIDDATA;
|
||||
err = AVERROR_INVALIDDATA;
|
||||
goto fail;
|
||||
}
|
||||
av_log(mov->fc, AV_LOG_TRACE, "on_parse_exit_offset=%"PRId64"\n", avio_tell(pb));
|
||||
|
||||
@ -6884,7 +6883,7 @@ static int mov_read_header(AVFormatContext *s)
|
||||
}
|
||||
if (st->codecpar->codec_id == AV_CODEC_ID_DVD_SUBTITLE) {
|
||||
if ((err = mov_rewrite_dvd_sub_extradata(st)) < 0)
|
||||
return err;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
if (mov->handbrake_version &&
|
||||
@ -6904,8 +6903,8 @@ static int mov_read_header(AVFormatContext *s)
|
||||
if (sc->data_size > INT64_MAX / sc->time_scale / 8) {
|
||||
av_log(s, AV_LOG_ERROR, "Overflow during bit rate calculation %"PRId64" * 8 * %d\n",
|
||||
sc->data_size, sc->time_scale);
|
||||
mov_read_close(s);
|
||||
return AVERROR_INVALIDDATA;
|
||||
err = AVERROR_INVALIDDATA;
|
||||
goto fail;
|
||||
}
|
||||
st->codecpar->bit_rate = sc->data_size * 8 * sc->time_scale / st->duration;
|
||||
}
|
||||
@ -6920,8 +6919,8 @@ static int mov_read_header(AVFormatContext *s)
|
||||
if (sc->data_size > INT64_MAX / sc->time_scale / 8) {
|
||||
av_log(s, AV_LOG_ERROR, "Overflow during bit rate calculation %"PRId64" * 8 * %d\n",
|
||||
sc->data_size, sc->time_scale);
|
||||
mov_read_close(s);
|
||||
return AVERROR_INVALIDDATA;
|
||||
err = AVERROR_INVALIDDATA;
|
||||
goto fail;
|
||||
}
|
||||
st->codecpar->bit_rate = sc->data_size * 8 * sc->time_scale /
|
||||
sc->duration_for_fps;
|
||||
@ -6945,8 +6944,7 @@ static int mov_read_header(AVFormatContext *s)
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
err = ff_replaygain_export(st, s->metadata);
|
||||
if (err < 0) {
|
||||
mov_read_close(s);
|
||||
return err;
|
||||
goto fail;
|
||||
}
|
||||
break;
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
@ -6954,7 +6952,7 @@ static int mov_read_header(AVFormatContext *s)
|
||||
err = av_stream_add_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, (uint8_t*)sc->display_matrix,
|
||||
sizeof(int32_t) * 9);
|
||||
if (err < 0)
|
||||
return err;
|
||||
goto fail;
|
||||
|
||||
sc->display_matrix = NULL;
|
||||
}
|
||||
@ -6963,7 +6961,7 @@ static int mov_read_header(AVFormatContext *s)
|
||||
(uint8_t *)sc->stereo3d,
|
||||
sizeof(*sc->stereo3d));
|
||||
if (err < 0)
|
||||
return err;
|
||||
goto fail;
|
||||
|
||||
sc->stereo3d = NULL;
|
||||
}
|
||||
@ -6972,7 +6970,7 @@ static int mov_read_header(AVFormatContext *s)
|
||||
(uint8_t *)sc->spherical,
|
||||
sc->spherical_size);
|
||||
if (err < 0)
|
||||
return err;
|
||||
goto fail;
|
||||
|
||||
sc->spherical = NULL;
|
||||
}
|
||||
@ -6981,7 +6979,7 @@ static int mov_read_header(AVFormatContext *s)
|
||||
(uint8_t *)sc->mastering,
|
||||
sizeof(*sc->mastering));
|
||||
if (err < 0)
|
||||
return err;
|
||||
goto fail;
|
||||
|
||||
sc->mastering = NULL;
|
||||
}
|
||||
@ -6990,7 +6988,7 @@ static int mov_read_header(AVFormatContext *s)
|
||||
(uint8_t *)sc->coll,
|
||||
sc->coll_size);
|
||||
if (err < 0)
|
||||
return err;
|
||||
goto fail;
|
||||
|
||||
sc->coll = NULL;
|
||||
}
|
||||
@ -7004,6 +7002,9 @@ static int mov_read_header(AVFormatContext *s)
|
||||
mov->frag_index.item[i].headers_read = 1;
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
mov_read_close(s);
|
||||
return err;
|
||||
}
|
||||
|
||||
static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st)
|
||||
|
Loading…
x
Reference in New Issue
Block a user