diff --git a/src/rpc.c b/src/rpc.c index 8ccf26a..ccc8903 100755 --- a/src/rpc.c +++ b/src/rpc.c @@ -1174,7 +1174,11 @@ int cwmp_handle_rpc_cpe_set_parameter_values(struct rpc *rpc) goto fault; } - xml_data_list_to_dm_parameter_list(&xml_list_set_param_value, &list_set_param_value); + fault_code = xml_data_list_to_dm_parameter_list(&xml_list_set_param_value, &list_set_param_value); + if (fault_code != FAULT_CPE_NO_FAULT) { + err_msg = "Duplicate parameter name found in the SPV parameter list"; + goto fault; + } /* Before set check if exists Device.ManagementServer.InformParameter.{i}.ParameterName with ForcedInform Parameter */ fault_code = validate_inform_parameter_name(&list_set_param_value); diff --git a/src/xml.c b/src/xml.c index 100abf2..bc90cda 100644 --- a/src/xml.c +++ b/src/xml.c @@ -1084,10 +1084,30 @@ void dm_parameter_list_to_xml_data_list(struct list_head *dm_parameter_list, str } } -void xml_data_list_to_dm_parameter_list(struct list_head *xml_data_list, struct list_head *dm_parameter_list) +static int validate_duplicate_param_name(const char *xml_param, struct list_head *dm_parameter_list) { - struct xml_list_data *xml_data; + struct cwmp_dm_parameter *param_value = NULL; + + if (CWMP_STRLEN(xml_param) == 0) + return 0; + + list_for_each_entry(param_value, dm_parameter_list, list) { + if (CWMP_STRCMP(param_value->name, xml_param) == 0) + return -1; + } + + return 0; +} + +int xml_data_list_to_dm_parameter_list(struct list_head *xml_data_list, struct list_head *dm_parameter_list) +{ + struct xml_list_data *xml_data = NULL; list_for_each_entry (xml_data, xml_data_list, list) { + /* duplicate parameter name should not exist */ + if (0 != validate_duplicate_param_name(xml_data->param_name, dm_parameter_list)) { + return FAULT_CPE_INVALID_ARGUMENTS; + } + struct cwmp_dm_parameter *dm_parameter; dm_parameter = calloc(1, sizeof(struct cwmp_dm_parameter)); list_add_tail(&dm_parameter->list, dm_parameter_list); @@ -1098,6 +1118,8 @@ void xml_data_list_to_dm_parameter_list(struct list_head *xml_data_list, struct dm_parameter->notification = xml_data->notification; dm_parameter->writable =xml_data->notification; } + + return FAULT_CPE_NO_FAULT; } void xml_data_list_to_cdu_operations_list(struct list_head *xml_data_list, struct list_head *cdu_operations_list) diff --git a/src/xml.h b/src/xml.h index 139225a..5514f8b 100644 --- a/src/xml.h +++ b/src/xml.h @@ -326,7 +326,7 @@ void add_xml_data_list(struct list_head *data_list, struct xml_list_data *xml_da mxml_node_t * build_top_body_soap_response(mxml_node_t *node, const char *method); mxml_node_t * build_top_body_soap_request(mxml_node_t *node, const char *method); void dm_parameter_list_to_xml_data_list(struct list_head *dm_parameter_list, struct list_head *xml_data_list); -void xml_data_list_to_dm_parameter_list(struct list_head *xml_data_list, struct list_head *dm_parameter_list); +int xml_data_list_to_dm_parameter_list(struct list_head *xml_data_list, struct list_head *dm_parameter_list); void xml_data_list_to_cdu_operations_list(struct list_head *xml_data_list, struct list_head *du_op_list); void cdu_operations_result_list_to_xml_data_list(struct list_head *du_op_res_list, struct list_head *xml_data_list); void cdu_operations_list_to_xml_data_list(struct list_head *du_op_list, struct list_head *xml_data_list);