diff --git a/spa/plugins/alsa/acp/proplist.h b/spa/plugins/alsa/acp/proplist.h index 23d03d0b1..2990c12af 100644 --- a/spa/plugins/alsa/acp/proplist.h +++ b/spa/plugins/alsa/acp/proplist.h @@ -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 diff --git a/src/modules/module-protocol-pulse/collect.c b/src/modules/module-protocol-pulse/collect.c index 71fa98f10..a1d8cc25b 100644 --- a/src/modules/module-protocol-pulse/collect.c +++ b/src/modules/module-protocol-pulse/collect.c @@ -508,7 +508,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]; @@ -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) 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; } diff --git a/src/modules/module-protocol-pulse/collect.h b/src/modules/module-protocol-pulse/collect.h index d5cfe9537..0c42cc4ec 100644 --- a/src/modules/module-protocol-pulse/collect.h +++ b/src/modules/module-protocol-pulse/collect.h @@ -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, diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c index b6c6bf1f6..c439edab3 100644 --- a/src/modules/module-protocol-pulse/pulse-server.c +++ b/src/modules/module-protocol-pulse/pulse-server.c @@ -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) { 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); @@ -3671,10 +3671,8 @@ static int fill_card_info(struct client *client, struct message *m, pi = &port_info[n]; if (pi->info && pi->n_props > 0 && - (items = spa_alloca(pi->n_props, sizeof(*items), MAX_ALLOCA_SIZE)) != NULL) { - dict.items = items; - pdict = collect_props(pi->info, &dict); - } + (items = spa_alloca(pi->n_props, sizeof(*items), MAX_ALLOCA_SIZE)) != NULL) + pdict = collect_props(pi->info, &dict, items, pi->n_props); message_put(m, 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; 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; struct spa_dict_item *items, *it2;