From 94c05e9e2d204189a766c931b734a1813382abda Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 27 Nov 2025 11:45:21 +0100 Subject: [PATCH] spa: make sure unpositioned raw audio has unknown channels Otherwise we might end up with partial channels when code doesn't check the unpositioned flag. It's better to set everything to unknown when there is a mismatch between channel count and layout. --- spa/include/spa/param/audio/dsd-utils.h | 9 +++++++-- spa/include/spa/param/audio/raw-utils.h | 4 +++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/spa/include/spa/param/audio/dsd-utils.h b/spa/include/spa/param/audio/dsd-utils.h index 2d99e79f2..2dab7cc19 100644 --- a/spa/include/spa/param/audio/dsd-utils.h +++ b/spa/include/spa/param/audio/dsd-utils.h @@ -33,6 +33,8 @@ spa_format_audio_dsd_parse(const struct spa_pod *format, struct spa_audio_info_d { struct spa_pod *position = NULL; int res; + uint32_t max_position = SPA_N_ELEMENTS(info->position); + info->flags = 0; res = spa_pod_parse_object(format, SPA_TYPE_OBJECT_Format, NULL, @@ -41,10 +43,13 @@ spa_format_audio_dsd_parse(const struct spa_pod *format, struct spa_audio_info_d SPA_FORMAT_AUDIO_rate, SPA_POD_OPT_Int(&info->rate), SPA_FORMAT_AUDIO_channels, SPA_POD_OPT_Int(&info->channels), SPA_FORMAT_AUDIO_position, SPA_POD_OPT_Pod(&position)); + if (info->channels > max_position) + return -ECHRNG; if (position == NULL || - !spa_pod_copy_array(position, SPA_TYPE_Id, info->position, SPA_N_ELEMENTS(info->position))) + spa_pod_copy_array(position, SPA_TYPE_Id, info->position, max_position) != info->channels) { SPA_FLAG_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED); - + spa_memzero(info->position, max_position * sizeof(info->position[0])); + } return res; } diff --git a/spa/include/spa/param/audio/raw-utils.h b/spa/include/spa/param/audio/raw-utils.h index da1ec7317..3f81b4a92 100644 --- a/spa/include/spa/param/audio/raw-utils.h +++ b/spa/include/spa/param/audio/raw-utils.h @@ -48,8 +48,10 @@ spa_format_audio_raw_ext_parse(const struct spa_pod *format, struct spa_audio_in if (info->channels > max_position) return -ECHRNG; if (position == NULL || - spa_pod_copy_array(position, SPA_TYPE_Id, info->position, max_position) != info->channels) + spa_pod_copy_array(position, SPA_TYPE_Id, info->position, max_position) != info->channels) { SPA_FLAG_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED); + spa_memzero(info->position, max_position * sizeof(info->position[0])); + } return res; }