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.
main
Frank Praznik 2022-07-11 16:59:23 -04:00 committed by Ethan Lee
parent 996cea31ee
commit 36d8460c9e
1 changed files with 15 additions and 9 deletions

View File

@ -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);