treewide: avoid unitialized spa_dict::flags

In multiple cases the `flags` member of `spa_dict` is left unitialized,
so try to avoid that. For example in `fill_node_info_proplist()` it is
accessed in `spa_dict_lookup_item()`.

This also modifies `collect_props()` to not depend on a partially initialized
`dict` parameter.
This commit is contained in:
Barnabás Pőcze 2026-05-10 16:44:17 +02:00 committed by Wim Taymans
parent 4c86dd53fc
commit 5e17161d0f
4 changed files with 13 additions and 10 deletions

View file

@ -180,8 +180,7 @@ static inline pa_proplist* pa_proplist_new_dict(const struct acp_dict *dict)
static inline void pa_proplist_as_dict(const pa_proplist *p, struct acp_dict *dict)
{
dict->n_items = pa_proplist_size(p);
dict->items = p->array.data;
*dict = ACP_DICT_INIT(p->array.data, pa_proplist_size(p));
}
#ifdef __cplusplus

View file

@ -502,7 +502,8 @@ uint32_t find_port_index(struct pw_manager_object *card, uint32_t direction, con
return SPA_ID_INVALID;
}
struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict)
struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict,
struct spa_dict_item *items, size_t capacity)
{
struct spa_pod_parser prs;
struct spa_pod_frame f[1];
@ -513,15 +514,18 @@ struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict)
spa_pod_parser_get_int(&prs, &n_items) < 0)
return NULL;
if (n_items < 0 || (size_t) n_items > capacity)
return NULL;
for (n = 0; n < n_items; n++) {
if (spa_pod_parser_get(&prs,
SPA_POD_String(&dict->items[n].key),
SPA_POD_String(&dict->items[n].value),
SPA_POD_String(&items[n].key),
SPA_POD_String(&items[n].value),
NULL) < 0)
break;
}
spa_pod_parser_pop(&prs, &f[0]);
dict->n_items = n;
*dict = SPA_DICT_INIT(items, n);
return dict;
}

View file

@ -142,7 +142,8 @@ uint32_t collect_transport_codec_info(struct pw_manager_object *card,
/* ========================================================================== */
struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict);
struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict,
struct spa_dict_item *items, size_t capacity);
uint32_t find_profile_index(struct pw_manager_object *card, const char *name);
uint32_t find_port_index(struct pw_manager_object *card, uint32_t direction, const char *port_name);
struct pw_manager_object *find_peer_for_link(struct pw_manager *m,

View file

@ -3282,7 +3282,7 @@ static int do_update_proplist(struct client *client, uint32_t command, uint32_t
static int do_remove_proplist(struct client *client, uint32_t command, uint32_t tag, struct message *m)
{
uint32_t i, channel;
struct spa_dict dict;
struct spa_dict dict = SPA_DICT_INIT(NULL, 0);
struct spa_dict_item *items;
spa_autoptr(pw_properties) props = pw_properties_new(NULL, NULL);
@ -3643,8 +3643,7 @@ static int fill_card_info(struct client *client, struct message *m,
if (pi->info && pi->n_props > 0) {
items = alloca(pi->n_props * sizeof(*items));
dict.items = items;
pdict = collect_props(pi->info, &dict);
pdict = collect_props(pi->info, &dict, items, pi->n_props);
}
message_put(m,