pw-cli: handle some allocation failures or NULL info

This commit is contained in:
Wim Taymans 2023-10-05 11:16:57 +02:00
parent cf44bf73da
commit 53a4a124aa

View file

@ -348,6 +348,10 @@ static void registry_event_global(void *data, uint32_t id,
bool ret; bool ret;
global = calloc(1, sizeof(struct global)); global = calloc(1, sizeof(struct global));
if (global == NULL) {
fprintf(stderr, "Allocation failed: %m");
return;
}
global->rd = rd; global->rd = rd;
global->id = id; global->id = id;
global->permissions = permissions; global->permissions = permissions;
@ -615,6 +619,8 @@ static void info_core(struct proxy_data *pd)
struct pw_core_info *info = pd->info; struct pw_core_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
printf("\tcookie: %u\n", info->cookie); printf("\tcookie: %u\n", info->cookie);
printf("\tuser-name: \"%s\"\n", info->user_name); printf("\tuser-name: \"%s\"\n", info->user_name);
printf("\thost-name: \"%s\"\n", info->host_name); printf("\thost-name: \"%s\"\n", info->host_name);
@ -629,6 +635,8 @@ static void info_module(struct proxy_data *pd)
struct pw_module_info *info = pd->info; struct pw_module_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
printf("\tname: \"%s\"\n", info->name); printf("\tname: \"%s\"\n", info->name);
printf("\tfilename: \"%s\"\n", info->filename); printf("\tfilename: \"%s\"\n", info->filename);
printf("\targs: \"%s\"\n", info->args); printf("\targs: \"%s\"\n", info->args);
@ -641,6 +649,8 @@ static void info_node(struct proxy_data *pd)
struct pw_node_info *info = pd->info; struct pw_node_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
printf("%c\tinput ports: %u/%u\n", MARK_CHANGE(PW_NODE_CHANGE_MASK_INPUT_PORTS), printf("%c\tinput ports: %u/%u\n", MARK_CHANGE(PW_NODE_CHANGE_MASK_INPUT_PORTS),
info->n_input_ports, info->max_input_ports); info->n_input_ports, info->max_input_ports);
printf("%c\toutput ports: %u/%u\n", MARK_CHANGE(PW_NODE_CHANGE_MASK_OUTPUT_PORTS), printf("%c\toutput ports: %u/%u\n", MARK_CHANGE(PW_NODE_CHANGE_MASK_OUTPUT_PORTS),
@ -661,6 +671,8 @@ static void info_port(struct proxy_data *pd)
struct pw_port_info *info = pd->info; struct pw_port_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
printf("\tdirection: \"%s\"\n", pw_direction_as_string(info->direction)); printf("\tdirection: \"%s\"\n", pw_direction_as_string(info->direction));
print_properties(info->props, MARK_CHANGE(PW_PORT_CHANGE_MASK_PROPS), true); print_properties(info->props, MARK_CHANGE(PW_PORT_CHANGE_MASK_PROPS), true);
print_params(info->params, info->n_params, MARK_CHANGE(PW_PORT_CHANGE_MASK_PARAMS), true); print_params(info->params, info->n_params, MARK_CHANGE(PW_PORT_CHANGE_MASK_PARAMS), true);
@ -672,6 +684,8 @@ static void info_factory(struct proxy_data *pd)
struct pw_factory_info *info = pd->info; struct pw_factory_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
printf("\tname: \"%s\"\n", info->name); printf("\tname: \"%s\"\n", info->name);
printf("\tobject-type: %s/%d\n", info->type, info->version); printf("\tobject-type: %s/%d\n", info->type, info->version);
print_properties(info->props, MARK_CHANGE(PW_FACTORY_CHANGE_MASK_PROPS), true); print_properties(info->props, MARK_CHANGE(PW_FACTORY_CHANGE_MASK_PROPS), true);
@ -683,6 +697,8 @@ static void info_client(struct proxy_data *pd)
struct pw_client_info *info = pd->info; struct pw_client_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
print_properties(info->props, MARK_CHANGE(PW_CLIENT_CHANGE_MASK_PROPS), true); print_properties(info->props, MARK_CHANGE(PW_CLIENT_CHANGE_MASK_PROPS), true);
info->change_mask = 0; info->change_mask = 0;
} }
@ -692,6 +708,8 @@ static void info_link(struct proxy_data *pd)
struct pw_link_info *info = pd->info; struct pw_link_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
printf("\toutput-node-id: %u\n", info->output_node_id); printf("\toutput-node-id: %u\n", info->output_node_id);
printf("\toutput-port-id: %u\n", info->output_port_id); printf("\toutput-port-id: %u\n", info->output_port_id);
printf("\tinput-node-id: %u\n", info->input_node_id); printf("\tinput-node-id: %u\n", info->input_node_id);
@ -717,6 +735,8 @@ static void info_device(struct proxy_data *pd)
struct pw_device_info *info = pd->info; struct pw_device_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
print_properties(info->props, MARK_CHANGE(PW_DEVICE_CHANGE_MASK_PROPS), true); print_properties(info->props, MARK_CHANGE(PW_DEVICE_CHANGE_MASK_PROPS), true);
print_params(info->params, info->n_params, MARK_CHANGE(PW_DEVICE_CHANGE_MASK_PARAMS), true); print_params(info->params, info->n_params, MARK_CHANGE(PW_DEVICE_CHANGE_MASK_PARAMS), true);
info->change_mask = 0; info->change_mask = 0;
@ -727,6 +747,8 @@ static void info_session(struct proxy_data *pd)
struct pw_session_info *info = pd->info; struct pw_session_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
print_properties(info->props, MARK_CHANGE(0), true); print_properties(info->props, MARK_CHANGE(0), true);
print_params(info->params, info->n_params, MARK_CHANGE(1), true); print_params(info->params, info->n_params, MARK_CHANGE(1), true);
info->change_mask = 0; info->change_mask = 0;
@ -738,6 +760,8 @@ static void info_endpoint(struct proxy_data *pd)
const char *direction; const char *direction;
info_global(pd); info_global(pd);
if (info == NULL)
return;
printf("\tname: %s\n", info->name); printf("\tname: %s\n", info->name);
printf("\tmedia-class: %s\n", info->media_class); printf("\tmedia-class: %s\n", info->media_class);
switch(info->direction) { switch(info->direction) {
@ -765,6 +789,8 @@ static void info_endpoint_stream(struct proxy_data *pd)
struct pw_endpoint_stream_info *info = pd->info; struct pw_endpoint_stream_info *info = pd->info;
info_global(pd); info_global(pd);
if (info == NULL)
return;
printf("\tid: %u\n", info->id); printf("\tid: %u\n", info->id);
printf("\tendpoint-id: %u\n", info->endpoint_id); printf("\tendpoint-id: %u\n", info->endpoint_id);
printf("\tname: %s\n", info->name); printf("\tname: %s\n", info->name);
@ -987,10 +1013,10 @@ static void session_event_info(void *data,
struct remote_data *rd = pd->rd; struct remote_data *rd = pd->rd;
struct pw_session_info *info = pd->info; struct pw_session_info *info = pd->info;
if (!info) { if (info == NULL)
info = pd->info = calloc(1, sizeof(*info)); info = pd->info = calloc(1, sizeof(*info));
if (info != NULL) {
info->id = update->id; info->id = update->id;
}
if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_PARAMS) { if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_PARAMS) {
info->n_params = update->n_params; info->n_params = update->n_params;
free(info->params); free(info->params);
@ -1003,7 +1029,7 @@ static void session_event_info(void *data,
info->props = info->props =
(struct spa_dict *) pw_properties_new_dict (update->props); (struct spa_dict *) pw_properties_new_dict (update->props);
} }
}
if (pd->global == NULL) if (pd->global == NULL)
pd->global = pw_map_lookup(&rd->globals, info->id); pd->global = pw_map_lookup(&rd->globals, info->id);
if (pd->global && pd->global->info_pending) { if (pd->global && pd->global->info_pending) {
@ -1034,14 +1060,15 @@ static void endpoint_event_info(void *data,
struct remote_data *rd = pd->rd; struct remote_data *rd = pd->rd;
struct pw_endpoint_info *info = pd->info; struct pw_endpoint_info *info = pd->info;
if (!info) { if (info == NULL)
info = pd->info = calloc(1, sizeof(*info)); info = pd->info = calloc(1, sizeof(*info));
if (info != NULL) {
info->id = update->id; info->id = update->id;
info->name = update->name ? strdup(update->name) : NULL; info->name = update->name ? strdup(update->name) : NULL;
info->media_class = update->media_class ? strdup(update->media_class) : NULL; info->media_class = update->media_class ? strdup(update->media_class) : NULL;
info->direction = update->direction; info->direction = update->direction;
info->flags = update->flags; info->flags = update->flags;
}
if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_STREAMS) if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_STREAMS)
info->n_streams = update->n_streams; info->n_streams = update->n_streams;
if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_SESSION) if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_SESSION)
@ -1058,7 +1085,7 @@ static void endpoint_event_info(void *data,
info->props = info->props =
(struct spa_dict *) pw_properties_new_dict (update->props); (struct spa_dict *) pw_properties_new_dict (update->props);
} }
}
if (pd->global == NULL) if (pd->global == NULL)
pd->global = pw_map_lookup(&rd->globals, info->id); pd->global = pw_map_lookup(&rd->globals, info->id);
if (pd->global && pd->global->info_pending) { if (pd->global && pd->global->info_pending) {
@ -1088,12 +1115,13 @@ static void endpoint_stream_event_info(void *data,
struct remote_data *rd = pd->rd; struct remote_data *rd = pd->rd;
struct pw_endpoint_stream_info *info = pd->info; struct pw_endpoint_stream_info *info = pd->info;
if (!info) { if (info == NULL)
info = pd->info = calloc(1, sizeof(*info)); info = pd->info = calloc(1, sizeof(*info));
if (info != NULL) {
info->id = update->id; info->id = update->id;
info->endpoint_id = update->endpoint_id; info->endpoint_id = update->endpoint_id;
info->name = update->name ? strdup(update->name) : NULL; info->name = update->name ? strdup(update->name) : NULL;
}
if (update->change_mask & PW_ENDPOINT_STREAM_CHANGE_MASK_PARAMS) { if (update->change_mask & PW_ENDPOINT_STREAM_CHANGE_MASK_PARAMS) {
info->n_params = update->n_params; info->n_params = update->n_params;
free(info->params); free(info->params);
@ -1106,7 +1134,7 @@ static void endpoint_stream_event_info(void *data,
info->props = info->props =
(struct spa_dict *) pw_properties_new_dict (update->props); (struct spa_dict *) pw_properties_new_dict (update->props);
} }
}
if (pd->global == NULL) if (pd->global == NULL)
pd->global = pw_map_lookup(&rd->globals, info->id); pd->global = pw_map_lookup(&rd->globals, info->id);
if (pd->global && pd->global->info_pending) { if (pd->global && pd->global->info_pending) {