Merge branch 'avoid_uninit_dict_flags' into 'master'

Draft: treewide: avoid unitialized `spa_dict::flags`

See merge request pipewire/pipewire!2826
This commit is contained in:
Barnabás Pőcze 2026-05-22 08:24:43 +02:00
commit 8bf55f6e1a
7 changed files with 18 additions and 15 deletions

View file

@ -109,7 +109,7 @@ spa_param_dict_info_parse(const struct spa_param_dict_info *info, size_t size,
items[n].key = key; items[n].key = key;
items[n].value = value; items[n].value = value;
} }
dict->items = items; *dict = SPA_DICT_INIT(items, n);
spa_pod_parser_pop(&prs, &f[0]); spa_pod_parser_pop(&prs, &f[0]);
return 0; return 0;
} }

View file

@ -96,7 +96,7 @@ spa_tag_info_parse(const struct spa_tag_info *info, struct spa_dict *dict, struc
items[n].key = key; items[n].key = key;
items[n].value = value; items[n].value = value;
} }
dict->items = items; *dict = SPA_DICT_INIT(items, n);
spa_pod_parser_pop(&prs, &f[0]); spa_pod_parser_pop(&prs, &f[0]);
return 0; return 0;
} }

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) static inline void pa_proplist_as_dict(const pa_proplist *p, struct acp_dict *dict)
{ {
dict->n_items = pa_proplist_size(p); *dict = ACP_DICT_INIT(p->array.data, pa_proplist_size(p));
dict->items = p->array.data;
} }
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -508,7 +508,8 @@ uint32_t find_port_index(struct pw_manager_object *card, uint32_t direction, con
return SPA_ID_INVALID; 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_parser prs;
struct spa_pod_frame f[1]; struct spa_pod_frame f[1];
@ -519,15 +520,18 @@ struct spa_dict *collect_props(struct spa_pod *info, struct spa_dict *dict)
spa_pod_parser_get_int(&prs, &n_items) < 0) spa_pod_parser_get_int(&prs, &n_items) < 0)
return NULL; return NULL;
if (n_items < 0 || (size_t) n_items > capacity)
return NULL;
for (n = 0; n < n_items; n++) { for (n = 0; n < n_items; n++) {
if (spa_pod_parser_get(&prs, if (spa_pod_parser_get(&prs,
SPA_POD_String(&dict->items[n].key), SPA_POD_String(&items[n].key),
SPA_POD_String(&dict->items[n].value), SPA_POD_String(&items[n].value),
NULL) < 0) NULL) < 0)
break; break;
} }
spa_pod_parser_pop(&prs, &f[0]); spa_pod_parser_pop(&prs, &f[0]);
dict->n_items = n; *dict = SPA_DICT_INIT(items, n);
return dict; 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_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); 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, struct pw_manager_object *find_peer_for_link(struct pw_manager *m,

View file

@ -3307,7 +3307,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) static int do_remove_proplist(struct client *client, uint32_t command, uint32_t tag, struct message *m)
{ {
uint32_t i, channel; uint32_t i, channel;
struct spa_dict dict; struct spa_dict dict = SPA_DICT_INIT(NULL, 0);
struct spa_dict_item *items; struct spa_dict_item *items;
spa_autoptr(pw_properties) props = pw_properties_new(NULL, NULL); spa_autoptr(pw_properties) props = pw_properties_new(NULL, NULL);
@ -3671,10 +3671,8 @@ static int fill_card_info(struct client *client, struct message *m,
pi = &port_info[n]; pi = &port_info[n];
if (pi->info && pi->n_props > 0 && if (pi->info && pi->n_props > 0 &&
(items = spa_alloca(pi->n_props, sizeof(*items), MAX_ALLOCA_SIZE)) != NULL) { (items = spa_alloca(pi->n_props, sizeof(*items), MAX_ALLOCA_SIZE)) != NULL)
dict.items = items; pdict = collect_props(pi->info, &dict, items, pi->n_props);
pdict = collect_props(pi->info, &dict);
}
message_put(m, message_put(m,
TAG_STRING, pi->name, /* port name */ TAG_STRING, pi->name, /* port name */
@ -4112,7 +4110,7 @@ static int fill_node_info_proplist(struct message *m, const struct spa_dict *nod
{ {
struct pw_client_info *client_info = client ? client->info : NULL; struct pw_client_info *client_info = client ? client->info : NULL;
uint32_t n_items, n; uint32_t n_items, n;
struct spa_dict dict, *client_props = NULL; struct spa_dict dict = SPA_DICT_INIT(NULL, 0), *client_props = NULL;
const struct spa_dict_item *it; const struct spa_dict_item *it;
struct spa_dict_item *items, *it2; struct spa_dict_item *items, *it2;

View file

@ -90,6 +90,7 @@ static struct spa_dict *pw_spa_dict_copy(struct spa_dict *dict)
if (copy->items == NULL) if (copy->items == NULL)
goto no_items; goto no_items;
copy->n_items = dict->n_items; copy->n_items = dict->n_items;
copy->flags = dict->flags & SPA_DICT_FLAG_SORTED;
for (i = 0; i < dict->n_items; i++) { for (i = 0; i < dict->n_items; i++) {
items[i].key = strdup(dict->items[i].key); items[i].key = strdup(dict->items[i].key);