modules: refactor permissions parsing

This commit is contained in:
Wim Taymans 2022-01-28 10:51:09 +01:00
parent 98aa2a04c7
commit 36d78c41a0
2 changed files with 31 additions and 24 deletions

View file

@ -79,6 +79,7 @@ do { \
if (spa_pod_parser_get(prs, \ if (spa_pod_parser_get(prs, \
SPA_POD_Int(&(d)->n_items), NULL) < 0) \ SPA_POD_Int(&(d)->n_items), NULL) < 0) \
return -EINVAL; \ return -EINVAL; \
(d)->items = NULL; \
if ((d)->n_items > 0) { \ if ((d)->n_items > 0) { \
(d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \ (d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \
for (i = 0; i < (d)->n_items; i++) { \ for (i = 0; i < (d)->n_items; i++) { \
@ -102,6 +103,7 @@ do { \
if (spa_pod_parser_get(prs, \ if (spa_pod_parser_get(prs, \
SPA_POD_Int(&n_params), NULL) < 0) \ SPA_POD_Int(&n_params), NULL) < 0) \
return -EINVAL; \ return -EINVAL; \
params = NULL; \
if (n_params > 0) { \ if (n_params > 0) { \
params = alloca(n_params * sizeof(struct spa_pos *)); \ params = alloca(n_params * sizeof(struct spa_pos *)); \
for (i = 0; i < n_params; i++) { \ for (i = 0; i < n_params; i++) { \
@ -118,6 +120,7 @@ do { \
if (spa_pod_parser_get(prs, \ if (spa_pod_parser_get(prs, \
SPA_POD_Int(&(n_params)), NULL) < 0) \ SPA_POD_Int(&(n_params)), NULL) < 0) \
return -EINVAL; \ return -EINVAL; \
params = NULL; \
if (n_params > 0) { \ if (n_params > 0) { \
params = alloca(n_params * sizeof(struct spa_param_info)); \ params = alloca(n_params * sizeof(struct spa_param_info)); \
for (i = 0; i < n_params; i++) { \ for (i = 0; i < n_params; i++) { \

View file

@ -172,6 +172,7 @@ do { \
if (spa_pod_parser_get(prs, \ if (spa_pod_parser_get(prs, \
SPA_POD_Int(&(d)->n_items), NULL) < 0) \ SPA_POD_Int(&(d)->n_items), NULL) < 0) \
return -EINVAL; \ return -EINVAL; \
(d)->items = NULL; \
if ((d)->n_items > 0) { \ if ((d)->n_items > 0) { \
uint32_t i; \ uint32_t i; \
(d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \ (d)->items = alloca((d)->n_items * sizeof(struct spa_dict_item)); \
@ -212,6 +213,7 @@ do { \
spa_pod_parser_get(prs, \ spa_pod_parser_get(prs, \
SPA_POD_Int(&(n_params)), NULL) < 0) \ SPA_POD_Int(&(n_params)), NULL) < 0) \
return -EINVAL; \ return -EINVAL; \
params = NULL; \
if (n_params > 0) { \ if (n_params > 0) { \
uint32_t i; \ uint32_t i; \
params = alloca(n_params * sizeof(struct spa_param_info)); \ params = alloca(n_params * sizeof(struct spa_param_info)); \
@ -222,9 +224,30 @@ do { \
return -EINVAL; \ return -EINVAL; \
} \ } \
} \ } \
spa_pod_parser_pop(prs, f); \
} while(0) } 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 * static void *
core_method_marshal_create_object(void *object, core_method_marshal_create_object(void *object,
const char *factory_name, 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 pw_permission *permissions;
struct spa_pod_parser prs; struct spa_pod_parser prs;
struct spa_pod_frame f[2]; 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); spa_pod_parser_init(&prs, msg->data, msg->size);
if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 || 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) SPA_POD_Int(&index), NULL) < 0)
return -EINVAL; return -EINVAL;
if (spa_pod_parser_push_struct(&prs, &f[1]) < 0 || parse_permissions_struct(&prs, &f[1], n_permissions, permissions);
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;
}
return pw_proxy_notify(proxy, struct pw_client_events, permissions, 0, index, n_permissions, permissions); 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 pw_permission *permissions;
struct spa_pod_parser prs; struct spa_pod_parser prs;
struct spa_pod_frame f[1]; struct spa_pod_frame f[1];
uint32_t i, n_permissions; uint32_t n_permissions;
spa_pod_parser_init(&prs, msg->data, msg->size); 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)); parse_permissions_struct(&prs, &f[0], n_permissions, permissions);
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_resource_notify(resource, struct pw_client_methods, update_permissions, 0, return pw_resource_notify(resource, struct pw_client_methods, update_permissions, 0,
n_permissions, permissions); n_permissions, permissions);
} }