From 98aa2a04c7d4f1e583dbc9cf0b51e87c697310b8 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 28 Jan 2022 10:35:14 +0100 Subject: [PATCH] modules: refactor param_info_parsing To add more checks later. See #2070 --- .../module-client-device/protocol-native.c | 32 +++++++------ .../module-client-node/protocol-native.c | 48 ++++++++----------- 2 files changed, 38 insertions(+), 42 deletions(-) diff --git a/src/modules/module-client-device/protocol-native.c b/src/modules/module-client-device/protocol-native.c index 77bfbe7dd..eb146cc86 100644 --- a/src/modules/module-client-device/protocol-native.c +++ b/src/modules/module-client-device/protocol-native.c @@ -70,6 +70,23 @@ do { \ } \ } while(0) +#define parse_param_info(prs,n_params,params) \ +do { \ + uint32_t i; \ + if (spa_pod_parser_get(prs, \ + SPA_POD_Int(&(n_params)), NULL) < 0) \ + return -EINVAL; \ + if (n_params > 0) { \ + params = alloca(n_params * sizeof(struct spa_param_info)); \ + for (i = 0; i < n_params; i++) { \ + if (spa_pod_parser_get(prs, \ + SPA_POD_Id(&(params[i]).id), \ + SPA_POD_Int(&(params[i]).flags), NULL) < 0) \ + return -EINVAL; \ + } \ + } \ +} while(0) + static int device_marshal_add_listener(void *object, struct spa_hook *listener, const struct spa_device_events *events, @@ -246,7 +263,6 @@ static int device_demarshal_info(void *object, struct spa_pod *ipod; struct spa_device_info info = SPA_DEVICE_INFO_INIT(), *infop; struct spa_dict props = SPA_DICT_INIT(NULL, 0); - uint32_t i; spa_pod_parser_init(&prs, msg->data, msg->size); @@ -274,19 +290,7 @@ static int device_demarshal_info(void *object, if (props.n_items > 0) info.props = &props; - if (spa_pod_parser_get(&p2, - SPA_POD_Int(&info.n_params), NULL) < 0) - return -EINVAL; - - if (info.n_params > 0) { - info.params = alloca(info.n_params * sizeof(struct spa_param_info)); - for (i = 0; i < info.n_params; i++) { - if (spa_pod_parser_get(&p2, - SPA_POD_Id(&info.params[i].id), - SPA_POD_Int(&info.params[i].flags), NULL) < 0) - return -EINVAL; - } - } + parse_param_info(&p2, info.n_params, info.params); } else { infop = NULL; diff --git a/src/modules/module-client-node/protocol-native.c b/src/modules/module-client-node/protocol-native.c index 6c0ca147d..13da9148c 100644 --- a/src/modules/module-client-node/protocol-native.c +++ b/src/modules/module-client-node/protocol-native.c @@ -112,6 +112,23 @@ do { \ } \ } while(0) +#define parse_param_info(prs,n_params,params) \ +do { \ + uint32_t i; \ + if (spa_pod_parser_get(prs, \ + SPA_POD_Int(&(n_params)), NULL) < 0) \ + return -EINVAL; \ + if (n_params > 0) { \ + params = alloca(n_params * sizeof(struct spa_param_info)); \ + for (i = 0; i < n_params; i++) { \ + if (spa_pod_parser_get(prs, \ + SPA_POD_Id(&(params[i]).id), \ + SPA_POD_Int(&(params[i]).flags), NULL) < 0) \ + return -EINVAL; \ + } \ + } \ +} while(0) + static int client_node_marshal_add_listener(void *object, struct spa_hook *listener, const struct pw_client_node_events *events, @@ -942,7 +959,6 @@ static int client_node_demarshal_update(void *object, const struct pw_protocol_n struct spa_node_info info = SPA_NODE_INFO_INIT(), *infop = NULL; struct spa_pod *ipod; struct spa_dict props = SPA_DICT_INIT(NULL, 0); - uint32_t i; spa_pod_parser_init(&prs, msg->data, msg->size); if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 || @@ -978,19 +994,7 @@ static int client_node_demarshal_update(void *object, const struct pw_protocol_n if (props.n_items > 0) info.props = &props; - if (spa_pod_parser_get(&p2, - SPA_POD_Int(&info.n_params), NULL) < 0) - return -EINVAL; - - if (info.n_params > 0) { - info.params = alloca(info.n_params * sizeof(struct spa_param_info)); - for (i = 0; i < info.n_params; i++) { - if (spa_pod_parser_get(&p2, - SPA_POD_Id(&info.params[i].id), - SPA_POD_Int(&info.params[i].flags), NULL) < 0) - return -EINVAL; - } - } + parse_param_info(&p2, info.n_params, info.params); } pw_resource_notify(resource, struct pw_client_node_methods, update, 0, change_mask, @@ -1004,7 +1008,7 @@ static int client_node_demarshal_port_update(void *object, const struct pw_proto struct pw_resource *resource = object; struct spa_pod_parser prs; struct spa_pod_frame f; - uint32_t i, direction, port_id, change_mask, n_params; + uint32_t direction, port_id, change_mask, n_params; const struct spa_pod **params = NULL; struct spa_port_info info = SPA_PORT_INFO_INIT(), *infop = NULL; struct spa_pod *ipod; @@ -1047,19 +1051,7 @@ static int client_node_demarshal_port_update(void *object, const struct pw_proto if (props.n_items > 0) info.props = &props; - if (spa_pod_parser_get(&p2, - SPA_POD_Int(&info.n_params), NULL) < 0) - return -EINVAL; - - if (info.n_params > 0) { - info.params = alloca(info.n_params * sizeof(struct spa_param_info)); - for (i = 0; i < info.n_params; i++) { - if (spa_pod_parser_get(&p2, - SPA_POD_Id(&info.params[i].id), - SPA_POD_Int(&info.params[i].flags), NULL) < 0) - return -EINVAL; - } - } + parse_param_info(&p2, info.n_params, info.params); } pw_resource_notify(resource, struct pw_client_node_methods, port_update, 0, direction,