pipewire: Dynamically allocate the buffer for node strings Calculate and allocate the buffer for the IO node name and path strings dynamically instead of using arbitrary sized static buffers.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
diff --git a/src/audio/pipewire/SDL_pipewire.c b/src/audio/pipewire/SDL_pipewire.c
index 78d47d9..aefa192 100644
--- a/src/audio/pipewire/SDL_pipewire.c
+++ b/src/audio/pipewire/SDL_pipewire.c
@@ -63,6 +63,7 @@
#define PW_POD_BUFFER_LENGTH 1024
#define PW_THREAD_NAME_BUFFER_LENGTH 128
+#define PW_MAX_IDENTIFIER_LENGTH 256
enum PW_READY_FLAGS
{
@@ -263,11 +264,10 @@ struct io_node
SDL_bool is_capture;
SDL_AudioSpec spec;
- /* FIXME: These sizes are arbitrary! */
- #define MAX_FRIENDLY_NAME 256
- #define MAX_IDENTIFIER_PATH 256
- char name[MAX_FRIENDLY_NAME]; /* Friendly name */
- char path[MAX_IDENTIFIER_PATH]; /* OS identifier (i.e. ALSA endpoint) */
+ const char *name; /* Friendly name */
+ const char *path; /* OS identifier (i.e. ALSA endpoint) */
+
+ char buf[]; /* Buffer to hold the name and path strings. */
};
/* The global hotplug thread and associated objects. */
@@ -626,7 +626,7 @@ get_name_from_json(const char *json)
{
struct spa_json parser[2];
char key[7]; /* "name" */
- char value[MAX_IDENTIFIER_PATH];
+ char value[PW_MAX_IDENTIFIER_LENGTH];
spa_json_init(&parser[0], json, SDL_strlen(json));
if (spa_json_enter_object(&parser[0], &parser[1]) <= 0) {
/* Not actually JSON */
@@ -686,6 +686,8 @@ registry_event_global_callback(void *object, uint32_t id, uint32_t permissions,
const char *node_path;
struct io_node *io;
SDL_bool is_capture;
+ int desc_buffer_len;
+ int path_buffer_len;
/* Just want sink and capture */
if (!SDL_strcasecmp(media_class, "Audio/Sink")) {
@@ -707,7 +709,9 @@ registry_event_global_callback(void *object, uint32_t id, uint32_t permissions,
}
/* Allocate and initialize the I/O node information struct */
- node->userdata = io = SDL_calloc(1, sizeof(struct io_node));
+ desc_buffer_len = SDL_strlen(node_desc) + 1;
+ path_buffer_len = SDL_strlen(node_path) + 1;
+ node->userdata = io = SDL_calloc(1, sizeof(struct io_node) + desc_buffer_len + path_buffer_len);
if (io == NULL) {
node_object_destroy(node);
SDL_OutOfMemory();
@@ -718,8 +722,10 @@ registry_event_global_callback(void *object, uint32_t id, uint32_t permissions,
io->id = id;
io->is_capture = is_capture;
io->spec.format = AUDIO_F32; /* Pipewire uses floats internally, other formats require conversion. */
- SDL_strlcpy(io->name, node_desc, sizeof(io->name));
- SDL_strlcpy(io->path, node_path, sizeof(io->path));
+ io->name = io->buf;
+ io->path = io->buf + desc_buffer_len;
+ SDL_strlcpy(io->buf, node_desc, desc_buffer_len);
+ SDL_strlcpy(io->buf + desc_buffer_len, node_path, path_buffer_len);
/* Update sync points */
hotplug_core_sync(node);