On Wed, May 20, 2020 at 10:29:17PM +0100, Mark Thompson wrote: > On 20/05/2020 22:16, Michael Niedermayer wrote: > > On Wed, May 20, 2020 at 08:56:29PM +0200, Michael Niedermayer wrote: > >> On Mon, Apr 20, 2020 at 07:34:44PM -0300, James Almer wrote: > >>> On 4/20/2020 7:03 PM, Michael Niedermayer wrote: > >>>> The limit is based on hevcdec.c > >>>> Fixes: > >>>> 20854/clusterfuzz-testcase-minimized-ffmpeg_BSF_HEVC_METADATA_fuzzer-5160442882424832 > >>>> Fixes: out of array access > >>>> > >>>> Found-by: continuous fuzzing process > >>>> https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg > >>>> Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc> > >>>> --- > >>>> libavcodec/cbs_h265_syntax_template.c | 2 +- > >>>> 1 file changed, 1 insertion(+), 1 deletion(-) > >>>> > >>>> diff --git a/libavcodec/cbs_h265_syntax_template.c > >>>> b/libavcodec/cbs_h265_syntax_template.c > >>>> index 180a045c34..b74b9648c3 100644 > >>>> --- a/libavcodec/cbs_h265_syntax_template.c > >>>> +++ b/libavcodec/cbs_h265_syntax_template.c > >>>> @@ -1367,7 +1367,7 @@ static int > >>>> FUNC(slice_segment_header)(CodedBitstreamContext *ctx, RWContext *rw, > >>>> infer(num_long_term_sps, 0); > >>>> idx_size = 0; > >>>> } > >>>> - ue(num_long_term_pics, 0, HEVC_MAX_LONG_TERM_REF_PICS); > >>>> + ue(num_long_term_pics, 0, > >>>> FFMIN(HEVC_MAX_LONG_TERM_REF_PICS, FF_ARRAY_ELEMS(current->poc_lsb_lt) - > >>>> current->num_long_term_sps)); > >>> > >>> Maybe poc_lsb_lt should also have HEVC_MAX_LONG_TERM_REF_PICS elems > >>> instead of HEVC_MAX_REFS, same as in the hevc decoder. > >> > >> ok, btw the decoder and cbs use completely unrelated variable names. > >> That should be cleaned up by someone i think ... > > I don't know how the decoder was written, but the intent in cbs has always > been to use exactly the same names as the standard does (even when those > names are long or redundant) so that code and variables can be precisely > matched for verification. > > >>> > >>> Also the spec defines some specific limit to this field: > >>> > >>> "When nuh_layer_id is equal to 0, the value of num_long_term_pics shall > >>> be less than or equal to sps_max_dec_pic_buffering_minus1[TemporalId] − > >>> NumNegativePics[CurrRpsIdx] − NumPositivePics[CurrRpsIdx] − > >>> num_long_term_sps − TwoVersionsOfCurrDecPicFlag" > >>> > >>> With CurrRpsIdx derived as: > >>> – If short_term_ref_pic_set_sps_flag is equal to 1, CurrRpsIdx is set > >>> equal to short_term_ref_pic_set_idx. > >>> – Otherwise, CurrRpsIdx is set equal to num_short_term_ref_pic_sets. > >>> > >>> And TwoVersionsOfCurrDecPicFlag as: > >>> "TwoVersionsOfCurrDecPicFlag = pps_curr_pic_ref_enabled_flag && > >>> (sample_adaptive_offset_enabled_flag || > >>> !pps_deblocking_filter_disabled_flag || > >>> deblocking_filter_override_enabled_flag) > >>> When sps_max_dec_pic_buffering_minus1[ TemporalId ] is equal to 0, the > >>> value of TwoVersionsOfCurrDecPicFlag shall be equal to 0." > >>> > >>> But i don't know if it's worth adding that many checks. > >> > >> I saw this too when i wrote the original patch, and i remember that > >> it at least felt like these checks would not cover all cases. > >> Maybe ive missed something but if they dont cover all then this would > >> be unrelated as it would neither be sufficient nor helpfull for this > >> bugfix > >> > >> will later apply this with the HEVC_MAX_LONG_TERM_REF_PICS as suggested > >> and backport unless i hear objections before > > > > tried this, but it seems that the increased size spreads and requires > > other arrays to be enarged too > > and that starts feeling a bit uncomfortable as a easy backportable > > fix > > so are you ok with the original variant and do you see any bugs/problems > > in that ? > > or i can also go for the array enlargement if thats really preferred ? > > just wanted to make sure its understood that enlarging one array alone > > doesnt work on its own ... > > > > diff --git a/libavcodec/cbs_h265.h b/libavcodec/cbs_h265.h > > index 73897f77a42..9b1895d460e 100644 > > --- a/libavcodec/cbs_h265.h > > +++ b/libavcodec/cbs_h265.h > > @@ -473,10 +473,10 @@ typedef struct H265RawSliceHeader { > > uint8_t num_long_term_sps; > > uint8_t num_long_term_pics; > > uint8_t lt_idx_sps[HEVC_MAX_REFS]; > > - uint8_t poc_lsb_lt[HEVC_MAX_REFS]; > > - uint8_t used_by_curr_pic_lt_flag[HEVC_MAX_REFS]; > > - uint8_t delta_poc_msb_present_flag[HEVC_MAX_REFS]; > > - uint32_t delta_poc_msb_cycle_lt[HEVC_MAX_REFS]; > > + uint8_t poc_lsb_lt[HEVC_MAX_LONG_TERM_REF_PICS]; > > + uint8_t used_by_curr_pic_lt_flag[HEVC_MAX_LONG_TERM_REF_PICS]; > > + uint8_t delta_poc_msb_present_flag[HEVC_MAX_LONG_TERM_REF_PICS]; > > + uint32_t delta_poc_msb_cycle_lt[HEVC_MAX_LONG_TERM_REF_PICS]; > > > > uint8_t slice_temporal_mvp_enabled_flag; > > > > @@ -488,9 +488,9 @@ typedef struct H265RawSliceHeader { > > uint8_t num_ref_idx_l1_active_minus1; > > > > uint8_t ref_pic_list_modification_flag_l0; > > - uint8_t list_entry_l0[HEVC_MAX_REFS]; > > + uint8_t list_entry_l0[HEVC_MAX_LONG_TERM_REF_PICS]; > > uint8_t ref_pic_list_modification_flag_l1; > > - uint8_t list_entry_l1[HEVC_MAX_REFS]; > > + uint8_t list_entry_l1[HEVC_MAX_LONG_TERM_REF_PICS]; > > > > uint8_t mvd_l1_zero_flag; > > uint8_t cabac_init_flag; > > > > [...] > > No, that doesn't make sense - the stream is invalid if it is trying to refer > to more than HEVC_MAX_REFS long term pics, so these extra entries could only > be used by invalid streams which are being incorrectly accepted. > > Changing the upper bound on num_long_term_pics to be HEVC_MAX_REFS - > num_long_term_sps would be sufficient to avoid this problem, though that will > admit some invalid streams which also contain short-term or self-reference > pics which together exceed the limit. Enforcing the proper limit as James > described is better, but adds more code to do it.
so thats then just this for the simple solution: ill apply this tomorrow and backport unless i hear objections. diff --git a/libavcodec/cbs_h265_syntax_template.c b/libavcodec/cbs_h265_syntax_template.c index d3ac618db60..9786a8dda23 100644 --- a/libavcodec/cbs_h265_syntax_template.c +++ b/libavcodec/cbs_h265_syntax_template.c @@ -1371,7 +1371,7 @@ static int FUNC(slice_segment_header)(CodedBitstreamContext *ctx, RWContext *rw, infer(num_long_term_sps, 0); idx_size = 0; } - ue(num_long_term_pics, 0, HEVC_MAX_LONG_TERM_REF_PICS); + ue(num_long_term_pics, 0, HEVC_MAX_REFS - current->num_long_term_sps); for (i = 0; i < current->num_long_term_sps + current->num_long_term_pics; i++) { [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB If you think the mosad wants you dead since a long time then you are either wrong or dead since a long time.
signature.asc
Description: PGP signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".