[FFmpeg-devel] [PATCH 2/3] avcodec/cbs_h266_syntax_template: Check num_subpic_cols for 0

James Almer jamrial at gmail.com
Tue Jul 25 04:54:20 EEST 2023


On 7/24/2023 9:46 PM, Michael Niedermayer wrote:
> Fixes: division by zero
> Fixes: 60306/clusterfuzz-testcase-minimized-ffmpeg_BSF_TRACE_HEADERS_fuzzer-5538913553612800
> 
> Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> ---
>   libavcodec/cbs_h266_syntax_template.c | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/libavcodec/cbs_h266_syntax_template.c b/libavcodec/cbs_h266_syntax_template.c
> index dce0216fbc..18ecf17e3b 100644
> --- a/libavcodec/cbs_h266_syntax_template.c
> +++ b/libavcodec/cbs_h266_syntax_template.c
> @@ -1187,6 +1187,8 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw,
>                   } else {
>                       int num_subpic_cols = tmp_width_val /
>                                        (current->sps_subpic_width_minus1[0] + 1);
> +                    if (!num_subpic_cols)
> +                        return AVERROR_INVALIDDATA;
>                       infer(sps_subpic_ctu_top_left_x[i],
>                             (i % num_subpic_cols) *
>                             (current->sps_subpic_width_minus1[0] + 1));

Does the following fix it too?

> diff --git a/libavcodec/cbs_h266_syntax_template.c b/libavcodec/cbs_h266_syntax_template.c
> index dce0216fbc..98a8e033bf 100644
> --- a/libavcodec/cbs_h266_syntax_template.c
> +++ b/libavcodec/cbs_h266_syntax_template.c
> @@ -1140,6 +1140,8 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw,
>          if (current->sps_num_subpics_minus1 > 0) {
>              int wlen = av_ceil_log2(tmp_width_val);
>              int hlen = av_ceil_log2(tmp_height_val);
> +            infer(sps_subpic_ctu_top_left_x[0], 0);
> +            infer(sps_subpic_ctu_top_left_y[0], 0);
>              if (current->sps_pic_width_max_in_luma_samples > ctb_size_y)
>                  ubs(wlen, sps_subpic_width_minus1[0], 1, 0);
>              else
> @@ -1147,7 +1149,7 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw,
>              if (current->sps_pic_height_max_in_luma_samples > ctb_size_y)
>                  ubs(hlen, sps_subpic_height_minus1[0], 1, 0);
>              else
> -                infer(sps_subpic_height_minus1[0], tmp_height_val);
> +                infer(sps_subpic_height_minus1[0], tmp_height_val - 1);
>              if (!current->sps_independent_subpics_flag) {
>                  flags(sps_subpic_treated_as_pic_flag[0], 1, 0);
>                  flags(sps_loop_filter_across_subpic_enabled_flag[0], 1, 0);
> @@ -1187,6 +1189,12 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw,
>                  } else {
>                      int num_subpic_cols = tmp_width_val /
>                                       (current->sps_subpic_width_minus1[0] + 1);
> +                    if (tmp_width_val % (current->sps_subpic_width_minus1[0] + 1) ||
> +                        tmp_height_val % (current->sps_subpic_width_minus1[0] + 1) ||
> +                        current->sps_num_subpics_minus1 !=
> +                        (num_subpic_cols * tmp_height_val /
> +                         (current->sps_subpic_height_minus1[0] + 1) - 1))
> +                        return AVERROR_INVALIDDATA;
>                      infer(sps_subpic_ctu_top_left_x[i],
>                            (i % num_subpic_cols) *
>                            (current->sps_subpic_width_minus1[0] + 1));

This checks the constrains defined in the spec.


More information about the ffmpeg-devel mailing list