mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
spa: param: add size checks for spa_audio_info* structs
In the API that take struct size for spa_audio_info*, also check the struct size.
This commit is contained in:
parent
8a23b13798
commit
c6d0b364ab
7 changed files with 197 additions and 3 deletions
|
|
@ -112,6 +112,7 @@ test('test-spa',
|
|||
executable('test-spa',
|
||||
'test-spa-buffer.c',
|
||||
'test-spa-control.c',
|
||||
'test-spa-format.c',
|
||||
'test-spa-json.c',
|
||||
'test-spa-utils.c',
|
||||
'test-spa-log.c',
|
||||
|
|
|
|||
129
test/test-spa-format.c
Normal file
129
test/test-spa-format.c
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
/* Simple Plugin API */
|
||||
/* SPDX-FileCopyrightText: Copyright © 2025 Pauli Virtanen */
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
|
||||
#include <spa/param/audio/format-utils.h>
|
||||
#include <spa/param/audio/format.h>
|
||||
|
||||
#include "pwtest.h"
|
||||
|
||||
PWTEST(audio_format_sizes)
|
||||
{
|
||||
union {
|
||||
uint8_t buf[1024];
|
||||
struct spa_audio_info align;
|
||||
} data;
|
||||
struct spa_audio_info info;
|
||||
size_t i;
|
||||
|
||||
memset(&info, 0xf3, sizeof(info));
|
||||
info.media_type = SPA_MEDIA_TYPE_audio;
|
||||
info.media_subtype = SPA_MEDIA_SUBTYPE_raw;
|
||||
info.info.raw.channels = 5;
|
||||
info.info.raw.format = SPA_AUDIO_FORMAT_F32P;
|
||||
info.info.raw.rate = 12345;
|
||||
info.info.raw.flags = 0;
|
||||
info.info.raw.position[0] = 1;
|
||||
info.info.raw.position[1] = 2;
|
||||
info.info.raw.position[2] = 3;
|
||||
info.info.raw.position[3] = 4;
|
||||
info.info.raw.position[4] = 5;
|
||||
|
||||
for (i = 0; i < sizeof(data.buf); ++i) {
|
||||
struct spa_pod *pod;
|
||||
uint8_t buf[4096];
|
||||
struct spa_pod_builder b;
|
||||
|
||||
spa_pod_builder_init(&b, buf, sizeof(buf));
|
||||
memcpy(data.buf, &info, sizeof(info));
|
||||
|
||||
pod = spa_format_audio_ext_build(&b, 123, (void *)data.buf, i);
|
||||
if (i < offsetof(struct spa_audio_info, info.raw)
|
||||
+ offsetof(struct spa_audio_info_raw, position))
|
||||
pwtest_bool_true(!pod);
|
||||
else
|
||||
pwtest_bool_true(pod);
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(data.buf); ++i) {
|
||||
struct spa_pod *pod;
|
||||
uint8_t buf[4096];
|
||||
struct spa_pod_builder b;
|
||||
int ret;
|
||||
|
||||
spa_pod_builder_init(&b, buf, sizeof(buf));
|
||||
pod = spa_format_audio_ext_build(&b, 123, &info, sizeof(info));
|
||||
pwtest_bool_true(pod);
|
||||
|
||||
memset(data.buf, 0xf3, sizeof(data.buf));
|
||||
|
||||
ret = spa_format_audio_ext_parse(pod, (void *)data.buf, i);
|
||||
if (i < offsetof(struct spa_audio_info, info.raw)
|
||||
+ offsetof(struct spa_audio_info_raw, position)
|
||||
+ info.info.raw.channels*sizeof(uint32_t)) {
|
||||
for (size_t j = i; j < sizeof(data.buf); ++j)
|
||||
pwtest_int_eq(data.buf[j], 0xf3);
|
||||
pwtest_int_lt(ret, 0);
|
||||
} else {
|
||||
pwtest_int_ge(ret, 0);
|
||||
pwtest_bool_true(memcmp(data.buf, &info, SPA_MIN(i, sizeof(info))) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
memset(&info, 0xf3, sizeof(info));
|
||||
info.media_type = SPA_MEDIA_TYPE_audio;
|
||||
info.media_subtype = SPA_MEDIA_SUBTYPE_aac;
|
||||
info.info.aac.rate = 12345;
|
||||
info.info.aac.channels = 6;
|
||||
info.info.aac.bitrate = 54321;
|
||||
info.info.aac.stream_format = SPA_AUDIO_AAC_STREAM_FORMAT_MP4LATM;
|
||||
|
||||
for (i = 0; i < sizeof(data.buf); ++i) {
|
||||
struct spa_pod *pod;
|
||||
uint8_t buf[4096];
|
||||
struct spa_pod_builder b;
|
||||
|
||||
spa_pod_builder_init(&b, buf, sizeof(buf));
|
||||
memcpy(data.buf, &info, sizeof(info));
|
||||
|
||||
pod = spa_format_audio_ext_build(&b, 123, (void *)data.buf, i);
|
||||
if (i < offsetof(struct spa_audio_info, info.raw)
|
||||
+ sizeof(struct spa_audio_info_aac))
|
||||
pwtest_bool_true(!pod);
|
||||
else
|
||||
pwtest_bool_true(pod);
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(data.buf); ++i) {
|
||||
struct spa_pod *pod;
|
||||
uint8_t buf[4096];
|
||||
struct spa_pod_builder b;
|
||||
int ret;
|
||||
|
||||
spa_pod_builder_init(&b, buf, sizeof(buf));
|
||||
pod = spa_format_audio_ext_build(&b, 123, &info, sizeof(info));
|
||||
pwtest_bool_true(pod);
|
||||
|
||||
memset(data.buf, 0xf3, sizeof(data.buf));
|
||||
|
||||
ret = spa_format_audio_ext_parse(pod, (void *)data.buf, i);
|
||||
if (i < offsetof(struct spa_audio_info, info.raw)
|
||||
+ sizeof(struct spa_audio_info_aac)) {
|
||||
for (size_t j = i; j < sizeof(data.buf); ++j)
|
||||
pwtest_int_eq(data.buf[j], 0xf3);
|
||||
pwtest_int_lt(ret, 0);
|
||||
} else {
|
||||
pwtest_int_ge(ret, 0);
|
||||
pwtest_bool_true(memcmp(data.buf, &info, SPA_MIN(i, sizeof(info))) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
return PWTEST_PASS;
|
||||
}
|
||||
|
||||
PWTEST_SUITE(spa_format)
|
||||
{
|
||||
pwtest_add(audio_format_sizes, PWTEST_NOARG);
|
||||
|
||||
return PWTEST_PASS;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue