[FFmpeg-devel] [PATCH] ff_split_xiph_headers returns broken header_len < 0
Michael Niedermayer
michaelni
Tue Apr 15 20:10:38 CEST 2008
On Tue, Apr 15, 2008 at 07:44:49PM +0200, Reimar D?ffinger wrote:
> On Tue, Apr 15, 2008 at 07:38:57PM +0200, Reimar D?ffinger wrote:
> > On Tue, Apr 15, 2008 at 07:11:12PM +0200, Michael Niedermayer wrote:
> > > On Tue, Apr 15, 2008 at 06:54:45PM +0200, Reimar D?ffinger wrote:
> > > > when trying to play http://wdz5.xs4all.nl/~hendrik/mmw-deadzy.ogg with
> > > > MPlayer (ffplay untested), the vorbis decoder crashes.
> > > > The reason is that ff_split_xiph_headers does not fail but returns an
> > > > invalid (negative) header_len[2].
> > > > Attached patch is one possible fix. Maybe doing a return -1 if this case
> > > > happens is the better solution, I just like to default to solutions that
> > > > have a higher chance of still working with broken files (though at least
> > > > in this case it does not help anyway, the files till does not play).
> > >
> > > I prefer a return -1 (unless doing something else helps some existing file)
> > > Also your check is insufficient header_len 0/1 still can reach arbitrary
> > > values, i think this should be fixed more generically. That is checking
> > > that all are within extradata.
> >
> > I misread one of the existing checks, I think attached patch should
> > actually work.
>
> With better aligning.
> Index: libavcodec/xiph.c
> ===================================================================
> --- libavcodec/xiph.c (revision 12807)
> +++ libavcodec/xiph.c (working copy)
> @@ -34,17 +34,24 @@
> extradata += header_len[i];
> }
> } else if (extradata[0] == 2) {
> + int overall_len = 0;
> for (i=0,j=1; i<2; i++,j++) {
> header_len[i] = 0;
> for (; j<extradata_size && extradata[j]==0xff; j++) {
> + if (overall_len > extradata_size - (0xff + 1))
> + return -1;
> + overall_len += 0xff + 1;
> header_len[i] += 0xff;
> }
> if (j >= extradata_size)
> return -1;
>
> + if (overall_len > extradata_size - (extradata[j] + 1))
> + return -1;
> + overall_len += extradata[j] + 1;
> header_len[i] += extradata[j];
int overall_len = 1;
for (i=0,j=1; i<2; i++,j++) {
header_len[i] = 0;
for (; overall_len <= extradata_size && extradata[j]==0xff; j++) {
overall_len += 0xff + 1;
header_len[i] += 0xff;
}
overall_len += extradata[j];
header_len[i] += extradata[j];
if (overall_len > extradata_size)
return -1;
and feel free to commit if above works
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Its not that you shouldnt use gotos but rather that you should write
readable code and code with gotos often but not always is less readable
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080415/43115e16/attachment.pgp>
More information about the ffmpeg-devel
mailing list