From 36d78c41a076ddeeba6369895fbdd8dc24937851 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 28 Jan 2022 10:51:09 +0100 Subject: [PATCH] modules: refactor permissions parsing --- .../module-client-node/protocol-native.c | 3 ++ .../module-protocol-native/protocol-native.c | 52 ++++++++++--------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/modules/module-client-node/protocol-native.c b/src/modules/module-client-node/protocol-native.c index 13da9148c..ac41d04ed 100644 --- a/src/modules/module-client-node/protocol-native.c +++ b/src/modules/module-client-node/protocol-native.c @@ -79,6 +79,7 @@ do { \ if (spa_pod_parser_get(prs, \ SPA_POD_Int(&(d)->n_items), NULL) < 0) \ return -EINVAL; \ + (d)->items = NULL; \ if ((d)->n_items > 0) { \ (d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \ for (i = 0; i < (d)->n_items; i++) { \ @@ -102,6 +103,7 @@ do { \ if (spa_pod_parser_get(prs, \ SPA_POD_Int(&n_params), NULL) < 0) \ return -EINVAL; \ + params = NULL; \ if (n_params > 0) { \ params = alloca(n_params * sizeof(struct spa_pos *)); \ for (i = 0; i < n_params; i++) { \ @@ -118,6 +120,7 @@ do { \ if (spa_pod_parser_get(prs, \ SPA_POD_Int(&(n_params)), NULL) < 0) \ return -EINVAL; \ + params = NULL; \ if (n_params > 0) { \ params = alloca(n_params * sizeof(struct spa_param_info)); \ for (i = 0; i < n_params; i++) { \ diff --git a/src/modules/module-protocol-native/protocol-native.c b/src/modules/module-protocol-native/protocol-native.c index 6bb3fed51..00cd971bd 100644 --- a/src/modules/module-protocol-native/protocol-native.c +++ b/src/modules/module-protocol-native/protocol-native.c @@ -172,6 +172,7 @@ do { \ if (spa_pod_parser_get(prs, \ SPA_POD_Int(&(d)->n_items), NULL) < 0) \ return -EINVAL; \ + (d)->items = NULL; \ if ((d)->n_items > 0) { \ uint32_t i; \ (d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \ @@ -212,6 +213,7 @@ do { \ spa_pod_parser_get(prs, \ SPA_POD_Int(&(n_params)), NULL) < 0) \ return -EINVAL; \ + params = NULL; \ if (n_params > 0) { \ uint32_t i; \ params = alloca(n_params * sizeof(struct spa_param_info)); \ @@ -222,9 +224,30 @@ do { \ return -EINVAL; \ } \ } \ + spa_pod_parser_pop(prs, f); \ } while(0) +#define parse_permissions_struct(prs,f,n_permissions,permissions) \ +do { \ + if (spa_pod_parser_push_struct(prs, f) < 0 || \ + spa_pod_parser_get(prs, \ + SPA_POD_Int(&n_permissions), NULL) < 0) \ + return -EINVAL; \ + permissions = NULL; \ + if (n_permissions > 0) { \ + uint32_t i; \ + permissions = alloca(n_permissions * sizeof(struct pw_permission)); \ + for (i = 0; i < n_permissions; i++) { \ + if (spa_pod_parser_get(prs, \ + SPA_POD_Int(&permissions[i].id), \ + SPA_POD_Int(&permissions[i].permissions), NULL) < 0) \ + return -EINVAL; \ + } \ + } \ + spa_pod_parser_pop(prs, f); \ +} while(0) + static void * core_method_marshal_create_object(void *object, const char *factory_name, @@ -1534,7 +1557,7 @@ static int client_demarshal_permissions(void *object, const struct pw_protocol_n struct pw_permission *permissions; struct spa_pod_parser prs; struct spa_pod_frame f[2]; - uint32_t i, index, n_permissions; + uint32_t index, n_permissions; spa_pod_parser_init(&prs, msg->data, msg->size); if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 || @@ -1542,18 +1565,8 @@ static int client_demarshal_permissions(void *object, const struct pw_protocol_n SPA_POD_Int(&index), NULL) < 0) return -EINVAL; - if (spa_pod_parser_push_struct(&prs, &f[1]) < 0 || - spa_pod_parser_get(&prs, - SPA_POD_Int(&n_permissions), NULL) < 0) - return -EINVAL; + parse_permissions_struct(&prs, &f[1], n_permissions, permissions); - permissions = alloca(n_permissions * sizeof(struct pw_permission)); - for (i = 0; i < n_permissions; i++) { - if (spa_pod_parser_get(&prs, - SPA_POD_Int(&permissions[i].id), - SPA_POD_Int(&permissions[i].permissions), NULL) < 0) - return -EINVAL; - } return pw_proxy_notify(proxy, struct pw_client_events, permissions, 0, index, n_permissions, permissions); } @@ -1675,21 +1688,12 @@ static int client_demarshal_update_permissions(void *object, const struct pw_pro struct pw_permission *permissions; struct spa_pod_parser prs; struct spa_pod_frame f[1]; - uint32_t i, n_permissions; + uint32_t n_permissions; spa_pod_parser_init(&prs, msg->data, msg->size); - if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 || - spa_pod_parser_get(&prs, - SPA_POD_Int(&n_permissions), NULL) < 0) - return -EINVAL; - permissions = alloca(n_permissions * sizeof(struct pw_permission)); - for (i = 0; i < n_permissions; i++) { - if (spa_pod_parser_get(&prs, - SPA_POD_Int(&permissions[i].id), - SPA_POD_Int(&permissions[i].permissions), NULL) < 0) - return -EINVAL; - } + parse_permissions_struct(&prs, &f[0], n_permissions, permissions); + return pw_resource_notify(resource, struct pw_client_methods, update_permissions, 0, n_permissions, permissions); }