[FFmpeg-devel] [PATCH] AAC Decoder round 4
Michael Niedermayer
michaelni
Wed Jul 30 19:30:17 CEST 2008
On Wed, Jul 30, 2008 at 05:10:42PM +0100, Robert Swain wrote:
> 2008/7/30 Michael Niedermayer <michaelni at gmx.at>:
> > On Wed, Jul 30, 2008 at 01:41:54PM +0100, Robert Swain wrote:
[..]
> > [...]
> >> >> + ics->num_window_groups = 1;
> >> >> + ics->group_len[0] = 1;
> >> >> + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) {
> >> >> + int i;
> >> >> + ics->max_sfb = get_bits(gb, 4);
> >> >> + grouping = get_bits(gb, 7);
> >> >> + for (i = 0; i < 7; i++) {
> >> >> + if (grouping & (1<<(6-i))) {
> >> >> + ics->group_len[ics->num_window_groups-1]++;
> >> >> + } else {
> >> >> + ics->num_window_groups++;
> >> >> + ics->group_len[ics->num_window_groups-1] = 1;
> >> >> + }
> >> >> + }
> >> >> + ics->swb_offset = swb_offset_128[ac->m4ac.sampling_index];
> >> >> + ics->num_swb = num_swb_128[ac->m4ac.sampling_index];
> >> >
> >> >> + if(ics->max_sfb > ics->num_swb) {
> >> >> + av_log(ac->avccontext, AV_LOG_ERROR,
> >> >> + "Number of scalefactor bands in group (%d) exceeds limit (%d).\n",
> >> >> + ics->max_sfb, ics->num_swb);
> >> >> + return -1;
> >> >> + }
> >> >
> >> > is it safe to write invalid values in the context and then exit with an
> >> > error? are they gurranteed not to be used or that their use is harmless?
> >>
> >> If this function returns -1 it will fall through to aac_decode_frame
> >> returning -1.
> >
> > yes but i think it can end up being used in future frames without
> > the code above being reexecuted to clean it up.
> > These may be bugs elsewhere but still i dont like security related
> > code that depends on the absence of bugs in large amounts of
> > distant code.
>
> So how should this be handled? I apologise if this is a stupid
> question. Should the values be assigned to temporary local vars and
> written to the context after validation?
thats an option, alternative is to zero them in the if(){return -1}
> Should this be done just for
> max_sfb and num_swb or are there others?
does the code contain more that are security relevant?
>
> > [...]
> >> >> + }
> >> >> + }
> >> >> + }
> >> >> + return 0;
> >> >> +}
> >> >> +
> >> >> +/**
> >> >> + * Decode scale_factor_data; reference: table 4.47.
> >> >> + *
> >> >
> >> >> + * @param mix_gain channel gain (Not used by AAC bitstream.)
> >> >> + * @param global_gain first scalefactor value as scalefactors are differentially coded
> >> >> + * @param band_type array of the band type used for a window group's scalefactor band
> >> >
> >> >> + * @param band_type_run_end array of the last scalefactor band of a band type run for a window group's scalefactor band
> >> >
> >> > this sounds a little confusing
> >>
> >> Someone else (Diego?) said this was confusing but I'm not sure how to
> >> simplify it and keep the same information present. I wanted to clarify
> >> what the indices of the variable were. At the time of complaint I
> >> suggested something like "array of the last scalefactor band of a band
> >> type run with indices [window group][scalefactor band]"
> >
> > well then add an example to calrify what the 2 arrays contain
>
> I'm not really sure what to suggest other than something like this:
you need to work on the line breaks ...
>
> Index: aac.c
> ===================================================================
> --- aac.c (revision 2930)
> +++ aac.c (working copy)
> @@ -1052,8 +1052,10 @@
> /**
> * Decode section_data payload; reference: table 4.46.
> *
> - * @param band_type array of the band type used for a
> window group's scalefactor band
> - * @param band_type_run_end array of the last scalefactor band of
> a band type run for a window group's scalefactor band
> + * @param band_type array of the used band type
> + * @param band_type_run_end array of the last scalefactor band of
> a band type run
> + *
honestly, what are you doing? :)
disable the darn line wraping of your editor/mua or attach the patch please
i would review it but i honestly cannot read this
[...]
>
> >> >> + int i;
> >> >> + int n = 1;
> >> >> + int num_excl_chan = 7;
> >> >> +
> >> >> + for (i = 0; i < 7; i++)
> >> >> + ac->che_drc.exclude_mask[i] = get_bits1(gb);
> >> >> +
> >> >> + while (n <= MAX_CHANNELS && num_excl_chan < MAX_CHANNELS - 7 && get_bits1(gb)) {
> >> >> + ac->che_drc.additional_excluded_chns[n-1]=1;
> >> >> + for (i = num_excl_chan; i < num_excl_chan+7; i++)
> >> >> + ac->che_drc.exclude_mask[i] = get_bits1(gb);
> >> >> + n++;
> >> >> + num_excl_chan += 7;
> >> >> + }
> >> >
> >> > the for and while can maybe be merged
> >>
> >> How about this?
> >
> > lin
> > e b
> > rea
> > ks
>
> :) Where? Does this help?:
no, see yourself:
[...]
> + (((i+1)%7) || (ac->che_drc.additional_excluded_chns[n++] =
> get_bits1(gb)));
> + i++)
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
No snowflake in an avalanche ever feels responsible. -- Voltaire
-------------- 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/20080730/6d79edc2/attachment.pgp>
More information about the ffmpeg-devel
mailing list