[PR] [release/8.1] avformat/iamf_parse: check that Parameter Definitions subblocks values are valid (PR #24298)
ffmpeg-devel via ffmpeg-devel <[email protected]>
| Newsgroups | gmane.comp.video.ffmpeg.devel |
|---|---|
| Message-ID | <[email protected]> |
PR #24298 opened by ffmpeg-devel URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24298 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24298.patch **Backport:** https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23915 Do a dry run of the subblocks structure before allocating an AVIAMFParamDefinition. >From 657882fb6e7ada163d014c0174e9ef130429a83d Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Sat, 25 Jul 2026 12:20:22 -0300 Subject: [PATCH 1/2] avformat/iamf_parse: check that num_sub_mixes and num_audio_elements in Mix Presentations are not zero As required by the spec in Section 3.7 Signed-off-by: James Almer <[email protected]> (cherry picked from commit 1b946a3abd81bd2b50ef6d38003ddb848be7acc7) --- libavformat/iamf_parse.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libavformat/iamf_parse.c b/libavformat/iamf_parse.c index 92c012ba72..8cbd7b8a42 100644 --- a/libavformat/iamf_parse.c +++ b/libavformat/iamf_parse.c @@ -1035,6 +1035,12 @@ static int mix_presentation_obu(void *s, IAMFContext *c, AVIOContext *pb, int le } nb_submixes = ffio_read_leb(pbc); + if (!nb_submixes) { + av_log(s, AV_LOG_ERROR, "Mix presentation %u has no submixes\n", mix_presentation_id); + ret = AVERROR_INVALIDDATA; + goto fail; + } + for (int i = 0; i < nb_submixes; i++) { AVIAMFSubmix *sub_mix; unsigned nb_elements, nb_layouts; @@ -1046,6 +1052,13 @@ static int mix_presentation_obu(void *s, IAMFContext *c, AVIOContext *pb, int le } nb_elements = ffio_read_leb(pbc); + if (!nb_elements) { + av_log(s, AV_LOG_ERROR, "Submix %d from Mix presentation %u has no audio elements\n", + i, mix_presentation_id); + ret = AVERROR_INVALIDDATA; + goto fail; + } + for (int j = 0; j < nb_elements; j++) { AVIAMFSubmixElement *submix_element; IAMFAudioElement *audio_element = NULL; -- 2.52.0 >From 1a748fe2cd43e3ead22fafb1b5b7d77f153898a8 Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Fri, 31 Jul 2026 20:45:49 -0300 Subject: [PATCH 2/2] avformat/iamf_parse: bound the output mix gain duration by the audio elements Based on a patch by Michael Niedermayer Fixes: unbounded allocation Fixes: poc_output_mix_config_dos.iamf Fixes: 387qWpjUgeKH Found-by: Duong Tran Thai (CyStack) Signed-off-by: James Almer <[email protected]> (cherry picked from commit d2476bfd2b0ab683f24ff92cb2b206549f0a1659) --- libavformat/iamf_parse.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/libavformat/iamf_parse.c b/libavformat/iamf_parse.c index 8cbd7b8a42..12d348a705 100644 --- a/libavformat/iamf_parse.c +++ b/libavformat/iamf_parse.c @@ -609,6 +609,7 @@ static int ambisonics_config(void *s, AVIOContext *pb, static int param_parse(void *s, IAMFContext *c, AVIOContext *pb, unsigned int type, const IAMFAudioElement *audio_element, + const IAMFCodecConfig *codec_config, AVIAMFParamDefinition **out_param_definition) { IAMFParamDefinition *param_definition = NULL; @@ -631,14 +632,10 @@ static int param_parse(void *s, IAMFContext *c, AVIOContext *pb, if (mode == 0) { duration = ffio_read_leb(pb); - if (!duration) + if (!duration || duration > av_rescale(codec_config->nb_samples, + codec_config->sample_rate, parameter_rate)) { + av_log(s, AV_LOG_ERROR, "Invalid block duration in parameter_id %u\n", parameter_id); return AVERROR_INVALIDDATA; - if (audio_element) { - const IAMFCodecConfig *codec_config = ff_iamf_get_codec_config(c, audio_element->codec_config_id); - if (duration > av_rescale(codec_config->nb_samples, codec_config->sample_rate, parameter_rate)) { - av_log(s, AV_LOG_ERROR, "Invalid block duration in parameter_id %u\n", parameter_id); - return AVERROR_INVALIDDATA; - } } constant_subblock_duration = ffio_read_leb(pb); if (constant_subblock_duration == 0) @@ -899,13 +896,17 @@ static int audio_element_obu(void *s, IAMFContext *c, AVIOContext *pb, int len) ret = AVERROR_INVALIDDATA; goto fail; } - ret = param_parse(s, c, pbc, type, audio_element, &element->demixing_info); + ret = param_parse(s, c, pbc, type, + audio_element, codec_config, + &element->demixing_info); } else if (type == AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN) { if (element->recon_gain_info) { ret = AVERROR_INVALIDDATA; goto fail; } - ret = param_parse(s, c, pbc, type, audio_element, &element->recon_gain_info); + ret = param_parse(s, c, pbc, type, + audio_element, codec_config, + &element->recon_gain_info); } else { unsigned param_definition_size = ffio_read_leb(pbc); avio_skip(pbc, param_definition_size); @@ -960,6 +961,7 @@ static int label_string(AVIOContext *pb, char **label) static int mix_presentation_obu(void *s, IAMFContext *c, AVIOContext *pb, int len) { AVIAMFMixPresentation *mix; + const IAMFCodecConfig *codec_config = NULL; IAMFMixPresentation **tmp, *mix_presentation = NULL; FFIOContext b; AVIOContext *pbc; @@ -1062,6 +1064,7 @@ static int mix_presentation_obu(void *s, IAMFContext *c, AVIOContext *pb, int le for (int j = 0; j < nb_elements; j++) { AVIAMFSubmixElement *submix_element; IAMFAudioElement *audio_element = NULL; + const IAMFCodecConfig *config = NULL; unsigned int rendering_config_extension_size; submix_element = av_iamf_submix_add_element(sub_mix); @@ -1084,6 +1087,7 @@ static int mix_presentation_obu(void *s, IAMFContext *c, AVIOContext *pb, int le ret = AVERROR_INVALIDDATA; goto fail; } + config = ff_iamf_get_codec_config(c, audio_element->codec_config_id); for (int k = 0; k < mix_presentation->count_label; k++) { char *annotation = NULL; @@ -1102,14 +1106,22 @@ static int mix_presentation_obu(void *s, IAMFContext *c, AVIOContext *pb, int le avio_skip(pbc, rendering_config_extension_size); ret = param_parse(s, c, pbc, AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN, - audio_element, + audio_element, config, &submix_element->element_mix_config); if (ret < 0) goto fail; submix_element->default_mix_gain = av_make_q(sign_extend(avio_rb16(pbc), 16), 1 << 8); + + if (!codec_config || (config->nb_samples > + av_rescale(codec_config->nb_samples, + codec_config->sample_rate, + config->sample_rate))) + codec_config = config; } - ret = param_parse(s, c, pbc, AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN, NULL, &sub_mix->output_mix_config); + ret = param_parse(s, c, pbc, AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN, + NULL, codec_config, + &sub_mix->output_mix_config); if (ret < 0) goto fail; sub_mix->default_mix_gain = av_make_q(sign_extend(avio_rb16(pbc), 16), 1 << 8); -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]