mirror of
https://dev.iopsys.eu/bbf/icwmp.git
synced 2025-12-10 07:44:41 +01:00
validate datatype in SPV request message
This commit is contained in:
parent
be6712567f
commit
29d498eeb6
5 changed files with 29 additions and 6 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
21
src/xml.c
21
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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue