From 36d8460c9e96962765fa6a5f3074ecf3c871c057 Mon Sep 17 00:00:00 2001 From: Frank Praznik Date: Mon, 11 Jul 2022 16:59:23 -0400 Subject: [PATCH] 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. --- src/audio/pipewire/SDL_pipewire.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/audio/pipewire/SDL_pipewire.c b/src/audio/pipewire/SDL_pipewire.c index 78d47d923..aefa19281 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);