[FFmpeg-devel] [PATCH v2 2/2] avformat: add demuxer for Pro Pinball Series' Soundbanks
Zane van Iperen
zane at zanevaniperen.com
Thu Mar 19 13:40:10 EET 2020
On Wed, 18 Mar 2020 16:05:40 +0100
"Andreas Rheinhardt" <andreas.rheinhardt at gmail.com> wrote:
> > +
> > +typedef struct PPBnkCtx {
> > + int track_count;
> > + PPBnkCtxTrack *tracks;
> > + uint32_t i;
>
> How about using a more descriptive name for this like current_track?
>
Done.
> > +
> > + ctx->track_count = hdr.track_count;
> > + if ((ret = av_reallocp_array(&ctx->tracks, hdr.track_count,
> > sizeof(PPBnkCtxTrack))))
>
> read_close is not called if read_header fails and therefore this array
> leaks if any of the following things that can fail fail.
> (It would probably make sense to call it automatically, but this will
> require changes in some demuxers.)
>
Fixed, I assumed it was called irregardless of failure.
I wonder how much work it would be to port all of the demuxers to
handle this...
> > + ctx->bytes_read = 0;
> > + ctx->i += 1;
> > + trk += 1;
>
> Why don't you simply use an increment ++?
>
Stylistic reasons. Is moot anyway as I had to change that code to fix a
different bug.
> > +
> > + if ((ret = avio_seek(s->pb, trk->data_offset, SEEK_SET)) <
> > 0)
>
> avio_seek returns int64_t, yet ret is only an int. This will cause
> problems when you seek to positions from 2GB to 4GB.
>
Fixed.
> > + return ret;
> > + else if (ret != trk->data_offset)
> > + return AVERROR(EIO);
>
> I wonder whether the seek should be attempted before you set
> bytes_read and i. If the seek fails and the caller retries to read a
> packet, it will (try to) read the wrong data.
>
Fixed. This lead me to another issue where it overreads trk before
checking for EOF (also fixed).
> > +static int pp_bnk_read_close(AVFormatContext *s)
> > +{
> > + PPBnkCtx *ctx = s->priv_data;
> > +
> > + if (ctx->tracks)
> > + av_freep(&ctx->tracks);
>
> The check here is unnecessary as av_freep() already checks for this;
> and moreover, read_close is only called if read_header succeeded, so
> ctx->tracks is always != NULL.
Fixed.
Zane
More information about the ffmpeg-devel
mailing list