avformat/dv: free all allocated structs on dv_read_header failure
Also propagate proper AVERROR codes while at it. Fixes ticket #8230. Reviewed-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
27da30addd
commit
72704cbff4
@ -495,16 +495,18 @@ static int dv_read_header(AVFormatContext *s)
|
|||||||
{
|
{
|
||||||
unsigned state, marker_pos = 0;
|
unsigned state, marker_pos = 0;
|
||||||
RawDVContext *c = s->priv_data;
|
RawDVContext *c = s->priv_data;
|
||||||
|
int ret;
|
||||||
|
|
||||||
c->dv_demux = avpriv_dv_init_demux(s);
|
c->dv_demux = avpriv_dv_init_demux(s);
|
||||||
if (!c->dv_demux)
|
if (!c->dv_demux)
|
||||||
return -1;
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
state = avio_rb32(s->pb);
|
state = avio_rb32(s->pb);
|
||||||
while ((state & 0xffffff7f) != 0x1f07003f) {
|
while ((state & 0xffffff7f) != 0x1f07003f) {
|
||||||
if (avio_feof(s->pb)) {
|
if (avio_feof(s->pb)) {
|
||||||
av_log(s, AV_LOG_ERROR, "Cannot find DV header.\n");
|
av_log(s, AV_LOG_ERROR, "Cannot find DV header.\n");
|
||||||
return -1;
|
ret = AVERROR_INVALIDDATA;
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
if (state == 0x003f0700 || state == 0xff3f0700)
|
if (state == 0x003f0700 || state == 0xff3f0700)
|
||||||
marker_pos = avio_tell(s->pb);
|
marker_pos = avio_tell(s->pb);
|
||||||
@ -518,8 +520,10 @@ static int dv_read_header(AVFormatContext *s)
|
|||||||
AV_WB32(c->buf, state);
|
AV_WB32(c->buf, state);
|
||||||
|
|
||||||
if (avio_read(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4) != DV_PROFILE_BYTES - 4 ||
|
if (avio_read(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4) != DV_PROFILE_BYTES - 4 ||
|
||||||
avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0)
|
avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0) {
|
||||||
return AVERROR(EIO);
|
ret = AVERROR(EIO);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
c->dv_demux->sys = av_dv_frame_profile(c->dv_demux->sys,
|
c->dv_demux->sys = av_dv_frame_profile(c->dv_demux->sys,
|
||||||
c->buf,
|
c->buf,
|
||||||
@ -527,7 +531,8 @@ static int dv_read_header(AVFormatContext *s)
|
|||||||
if (!c->dv_demux->sys) {
|
if (!c->dv_demux->sys) {
|
||||||
av_log(s, AV_LOG_ERROR,
|
av_log(s, AV_LOG_ERROR,
|
||||||
"Can't determine profile of DV input stream.\n");
|
"Can't determine profile of DV input stream.\n");
|
||||||
return -1;
|
ret = AVERROR_INVALIDDATA;
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->bit_rate = av_rescale_q(c->dv_demux->sys->frame_size,
|
s->bit_rate = av_rescale_q(c->dv_demux->sys->frame_size,
|
||||||
@ -538,6 +543,11 @@ static int dv_read_header(AVFormatContext *s)
|
|||||||
dv_read_timecode(s);
|
dv_read_timecode(s);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
av_freep(&c->dv_demux);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user