From 29d498eeb6eade7ffda909fd0318599f1e703cf1 Mon Sep 17 00:00:00 2001 From: Suvendhu Hansa Date: Tue, 3 Sep 2024 02:20:52 +0530 Subject: [PATCH] validate datatype in SPV request message --- src/cwmp_cli.c | 2 +- src/datamodel_interface.c | 5 +++-- src/datamodel_interface.h | 2 +- src/rpc.c | 5 +++-- src/xml.c | 21 +++++++++++++++++++++ 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/cwmp_cli.c b/src/cwmp_cli.c index 4d6480c..602b115 100644 --- a/src/cwmp_cli.c +++ b/src/cwmp_cli.c @@ -81,7 +81,7 @@ char *cmd_set_exec_func(struct cmd_input in, union cmd_result *res) LIST_HEAD(faults_list); - int fault_idx = cwmp_set_parameter_value(in.first_input, in.second_input, &faults_list); + int fault_idx = cwmp_set_parameter_value(in.first_input, in.second_input, NULL, &faults_list); if (fault_idx != FAULT_CPE_NO_FAULT) { struct cwmp_param_fault *param_fault = NULL; char *fault = NULL; diff --git a/src/datamodel_interface.c b/src/datamodel_interface.c index 56bbb6d..fb43d09 100755 --- a/src/datamodel_interface.c +++ b/src/datamodel_interface.c @@ -678,7 +678,7 @@ static void ubus_set_value_callback(struct ubus_request *req, int type __attribu } } -int cwmp_set_parameter_value(const char *parameter_name, const char *parameter_value, struct list_head *faults_list) +int cwmp_set_parameter_value(const char *parameter_name, const char *parameter_value, const char *type, struct list_head *faults_list) { char *inst_path = NULL; struct blob_buf b = {0}; @@ -700,6 +700,7 @@ int cwmp_set_parameter_value(const char *parameter_name, const char *parameter_v bb_add_string(&b, "path", inst_path); bb_add_string(&b, "value", parameter_value); + bb_add_string(&b, "datatype", type ? type : ""); prepare_optional_table(&b); int e = icwmp_ubus_invoke(BBFDM_OBJECT_NAME, "set", b.head, ubus_set_value_callback, &set_result); @@ -732,7 +733,7 @@ int cwmp_set_multi_parameters_value(struct list_head *parameters_values_list, st if (CWMP_STRLEN(param_value->name) == 0) continue; - int res = cwmp_set_parameter_value(param_value->name, param_value->value, faults_list); + int res = cwmp_set_parameter_value(param_value->name, param_value->value, param_value->type, faults_list); if (res != FAULT_CPE_NO_FAULT) fault_occured = true; } diff --git a/src/datamodel_interface.h b/src/datamodel_interface.h index 347831b..2e945c0 100644 --- a/src/datamodel_interface.h +++ b/src/datamodel_interface.h @@ -29,7 +29,7 @@ char *cwmp_get_parameter_names(const char *parameter_name, bool next_level, stru char *cwmp_validate_parameter_name(const char *param_name, bool next_level, struct list_head *param_list); char *cwmp_validate_multi_instance_path(const char *object, struct list_head *parameters_list); -int cwmp_set_parameter_value(const char *parameter_name, const char *parameter_value, struct list_head *faults_list); +int cwmp_set_parameter_value(const char *parameter_name, const char *parameter_value, const char *type, struct list_head *faults_list); int cwmp_set_multi_parameters_value(struct list_head *parameters_values_list, struct list_head *faults_list); bool cwmp_add_object(const char *object_name, struct object_result *res); diff --git a/src/rpc.c b/src/rpc.c index f98fbf4..32c7194 100755 --- a/src/rpc.c +++ b/src/rpc.c @@ -1121,8 +1121,6 @@ int cwmp_handle_rpc_cpe_set_parameter_values(struct rpc *rpc) set_diagnostic_state_end_session_flag(param_value->name, param_value->value); } - cwmp_free_all_xml_data_list(&xml_list_set_param_value); - cwmp_free_all_dm_parameter_list(&list_set_param_value); icwmp_restart_services(RELOAD_IMMIDIATE, true, false); @@ -1151,9 +1149,12 @@ int cwmp_handle_rpc_cpe_set_parameter_values(struct rpc *rpc) cwmp_set_end_session(END_SESSION_RESTART_SERVICES); } + cwmp_free_all_xml_data_list(&xml_list_set_param_value); + cwmp_free_all_dm_parameter_list(&list_set_param_value); return 0; fault: + cwmp_free_all_xml_data_list(&xml_list_set_param_value); cwmp_free_all_dm_parameter_list(&list_set_param_value); if (cwmp_create_fault_message(rpc, fault_code, err_msg)) ret = -1; diff --git a/src/xml.c b/src/xml.c index 6f4251f..b02001b 100644 --- a/src/xml.c +++ b/src/xml.c @@ -798,6 +798,7 @@ int load_xml_list_node_data(int node_ref, mxml_node_t *node, struct xml_data_str xml_attrs_args.window_end = &xml_data->windowend; xml_attrs_args.notification_change = &xml_data->notification_change; xml_attrs_args.access_list = &xml_data->access_list; + xml_attrs_args.xsi_type = &xml_data->param_type; xml_attrs_args.url = &xml_data->url; xml_attrs_args.uuid = &xml_data->uuid; @@ -886,6 +887,7 @@ int load_single_xml_node_data(int node_ref, mxml_node_t *node, struct xml_data_s const char *xml_node_name = mxmlGetElement(b); mxml_type_t node_type = mxmlGetType(b); mxml_node_t *firstchild = mxmlGetFirstChild(b); + char *xsi_type = NULL; char *node_name = get_xml_node_name_by_switch_name((char *)xml_node_name); if (!check_node_is_switch_by_node_name(node_ref, node_name)) @@ -912,6 +914,11 @@ int load_single_xml_node_data(int node_ref, mxml_node_t *node, struct xml_data_s b = mxmlWalkNext(b, node, MXML_DESCEND); continue; } + + if (node_ref == SOAP_REQ_SPV_LIST_REF && CWMP_STRCMP((char *)node_name, "Value") == 0) { + xsi_type = (char *)mxmlElementGetAttr(b, "xsi:type"); + } + idx = get_xml_tag_index((char *)node_name); // cppcheck-suppress knownConditionTrueFalse @@ -943,6 +950,20 @@ int load_single_xml_node_data(int node_ref, mxml_node_t *node, struct xml_data_s case XML_STRING: str = (char **)(*ptr); *str = strdup(opaque ? opaque : ""); + + // If SPV then need to forward datatype received in xml + if (node_ref == SOAP_REQ_SPV_LIST_REF && CWMP_STRCMP((char *)node_name, "Value") == 0) { + int ids = get_xml_tag_index("xsi:type"); + void **p = (void **)((char *)xml_attrs + ids * sizeof(char *)); + str = (char **)(*p); + + if (CWMP_STRNCMP(xsi_type, "xsd:", 4) == 0) { + *str = strdup(xsi_type + 4); + } else { + *str = strdup(""); + } + } + break; case XML_INTEGER: intgr = (int *)(*ptr);