DHCPv4: fix SentOption segfault issue

- Device.DHCPv4.Client.{i}.SentOption.1.Enable : fix get/set segfault issue
- Device.DHCPv4.Client.{i}.SentOption.1.Tag : fix get/set segfault issue
- Device.DHCPv4.Client.{i}.SentOption.1.Value : fix get/set segfault issue
- Device.DHCPv4.Client.{i}.SentOption.: fix add/del segfault issue
This commit is contained in:
Amin Ben Ramdhane 2020-10-10 11:51:18 +01:00
parent 802d575b3f
commit faa12a3431
4 changed files with 74 additions and 50 deletions

View file

@ -1509,6 +1509,7 @@ static int get_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *d
*value = "";
return 0;
}
char *linker = dmstrdup(section_name(((struct dhcp_client_args *)data)->dhcp_client_conf));
adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim, dm_delim), linker, value);
if (*value == NULL)
@ -1689,10 +1690,7 @@ static int get_DHCPv4Client_LeaseTimeRemaining(char *refparam, struct dmctx *ctx
return 0;
dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct dhcp_client_args *)data)->dhcp_client_conf), String}}, 1, &res);
if (!res) {
*value = "";
return 0;
}
DM_ASSERT(res, *value = "");
*value = dmjson_get_value(res, 2, "data", "leasetime");
return 0;
}
@ -1741,7 +1739,7 @@ static int get_DHCPv4ClientSentOption_Enable(char *refparam, struct dmctx *ctx,
}
dmasprintf(&opttagvalue, "%s:%s", ((struct dhcp_client_option_args *)data)->option_tag, ((struct dhcp_client_option_args *)data)->value);
dmuci_get_value_by_section_string(((struct dhcp_client_option_args *)data)->client_sect, "sendopts", &v);
if (is_elt_exit_in_str_list(v, opttagvalue))
if (elt_exits_in_str_list(v, opttagvalue))
*value = "1";
else
*value = "0";
@ -1766,7 +1764,7 @@ static int set_DHCPv4ClientSentOption_Enable(char *refparam, struct dmctx *ctx,
return 0;
dmasprintf(&opttagvalue, "%s:%s", ((struct dhcp_client_option_args *)data)->option_tag, ((struct dhcp_client_option_args *)data)->value);
if (b) {
if (!is_elt_exit_in_str_list(v, opttagvalue)) {
if (!elt_exits_in_str_list(v, opttagvalue)) {
add_elt_to_str_list(&v, opttagvalue);
dmuci_set_value_by_section(((struct dhcp_client_option_args *)data)->client_sect, "sendopts", v);
}
@ -1877,7 +1875,7 @@ static int get_DHCPv4ClientReqOption_Enable(char *refparam, struct dmctx *ctx, v
return 0;
}
dmuci_get_value_by_section_string(((struct dhcp_client_option_args *)data)->client_sect, "reqopts", &v);
if (is_elt_exit_in_str_list(v, ((struct dhcp_client_option_args *)data)->option_tag))
if (elt_exits_in_str_list(v, ((struct dhcp_client_option_args *)data)->option_tag))
*value = "1";
else
*value = "0";
@ -1900,7 +1898,7 @@ static int set_DHCPv4ClientReqOption_Enable(char *refparam, struct dmctx *ctx, v
if (strcmp(((struct dhcp_client_option_args *)data)->option_tag, "0") == 0)
return 0;
if (b) {
if (!is_elt_exit_in_str_list(v, ((struct dhcp_client_option_args *)data)->option_tag)) {
if (!elt_exits_in_str_list(v, ((struct dhcp_client_option_args *)data)->option_tag)) {
add_elt_to_str_list(&v, ((struct dhcp_client_option_args *)data)->option_tag);
dmuci_set_value_by_section(((struct dhcp_client_option_args *)data)->client_sect, "reqopts", v);
}
@ -2669,7 +2667,7 @@ static int browseDHCPv4ClientInst(struct dmctx *dmctx, DMNODE *parent_node, void
{
char *inst, *max_inst = NULL;
struct dmmap_dup *p;
char *type, *ipv4addr = "", *ipv6addr = "", *proto, *ip_inst, *mask4 = NULL;
char *type, *ipv4addr = "", *ipv6addr = "", *proto, *mask4 = NULL;
json_object *res, *jobj;
struct dhcp_client_args dhcp_client_arg = {0};
LIST_HEAD(dup_list);
@ -2688,7 +2686,7 @@ static int browseDHCPv4ClientInst(struct dmctx *dmctx, DMNODE *parent_node, void
if (res) {
jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
ipv4addr = dmjson_get_value(jobj, 1, "address");
mask4= dmjson_get_value(jobj, 1, "mask");
mask4 = dmjson_get_value(jobj, 1, "mask");
}
}
@ -2702,10 +2700,13 @@ static int browseDHCPv4ClientInst(struct dmctx *dmctx, DMNODE *parent_node, void
}
dmuci_get_value_by_section_string(p->config_section, "proto", &proto);
dmuci_get_value_by_section_string(p->config_section, "ip_int_instance", &ip_inst);
if (ipv4addr[0] == '\0' && ipv6addr[0] == '\0' && strcmp(proto, "dhcp") != 0 && strcmp(proto, "dhcpv6") != 0 && strcmp(ip_inst, "") == 0 && strcmp(type, "bridge") != 0) {
p->config_section=NULL;
if (ipv4addr[0] == '\0' &&
ipv6addr[0] == '\0' &&
strcmp(proto, "dhcp") != 0 &&
strcmp(proto, "dhcpv6") != 0 &&
strcmp(type, "bridge") != 0) {
p->config_section = NULL;
DMUCI_SET_VALUE_BY_SECTION(bbfdm, p->dmmap_section, "section_name", "");
}
}
@ -2720,7 +2721,7 @@ static int browseDHCPv4ClientInst(struct dmctx *dmctx, DMNODE *parent_node, void
dhcp_client_arg.mask = dmstrdup(mask4);
dhcp_client_arg.dhcp_client_conf = p->config_section;
dhcp_client_arg.dhcp_client_dm= p->dmmap_section;
dhcp_client_arg.dhcp_client_dm = p->dmmap_section;
inst = handle_update_instance(1, dmctx, &max_inst, update_instance_alias, 5,
p->dmmap_section, "bbf_dhcpv4client_instance", "bbf_dhcpv4client_alias", "dmmap_dhcp_client", "interface");
@ -2770,10 +2771,10 @@ static int browseDHCPv4ClientSentOptionInst(struct dmctx *dmctx, DMNODE *parent_
uci_path_foreach_option_eq(bbfdm, "dmmap_dhcp_client", "send_option", "section_name", dhcp_client_args->dhcp_client_conf?section_name(dhcp_client_args->dhcp_client_conf):"", dmmap_sect) {
dmuci_get_value_by_section_string(dmmap_sect, "option_tag", &v1);
dmuci_get_value_by_section_string(dmmap_sect, "option_value", &v2);
dhcp_client_opt_args.client_sect= dhcp_client_args->dhcp_client_conf;
dhcp_client_opt_args.option_tag= dmstrdup(v1);
dhcp_client_opt_args.value= dmstrdup(v2);
dhcp_client_opt_args.opt_sect= dmmap_sect;
dhcp_client_opt_args.client_sect = dhcp_client_args->dhcp_client_conf;
dhcp_client_opt_args.option_tag = dmstrdup(v1);
dhcp_client_opt_args.value = dmstrdup(v2);
dhcp_client_opt_args.opt_sect = dmmap_sect;
browse_args.option = "section_name";
browse_args.value = section_name(dhcp_client_args->dhcp_client_conf);
@ -3103,7 +3104,7 @@ DMLEAF tDHCPv4ServerPoolParams[] = {
{"Order", &DMWRITE, DMT_UNINT, get_dhcp_sever_pool_order, set_dhcp_sever_pool_order, NULL, NULL, BBFDM_BOTH},
{"Enable", &DMWRITE, DMT_BOOL, get_dhcp_enable, set_dhcp_enable, NULL, NULL, BBFDM_BOTH},
{"MinAddress", &DMWRITE, DMT_STRING, get_dhcp_interval_address_min, set_dhcp_address_min, NULL, NULL, BBFDM_BOTH},
{"MaxAddress", &DMWRITE, DMT_STRING,get_dhcp_interval_address_max, set_dhcp_address_max, NULL, NULL, BBFDM_BOTH},
{"MaxAddress", &DMWRITE, DMT_STRING, get_dhcp_interval_address_max, set_dhcp_address_max, NULL, NULL, BBFDM_BOTH},
{"ReservedAddresses", &DMWRITE, DMT_STRING, get_dhcp_reserved_addresses, set_dhcp_reserved_addresses, NULL, NULL, BBFDM_BOTH},
{"SubnetMask", &DMWRITE, DMT_STRING,get_dhcp_subnetmask, set_dhcp_subnetmask, NULL, NULL, BBFDM_BOTH},
{"IPRouters", &DMWRITE, DMT_STRING, get_dhcp_iprouters, set_dhcp_iprouters, NULL, NULL, BBFDM_BOTH},
@ -3175,6 +3176,7 @@ DMLEAF tDHCPv4RelayParams[] = {
{"ForwardingNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv4Relay_ForwardingNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
{0}
};
/* *** Device.DHCPv4.Relay.Forwarding.{i}. *** */
DMLEAF tDHCPv4RelayForwardingParams[] = {
/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/

View file

@ -794,7 +794,7 @@ int os_get_QoSClassification_Interface(char *refparam, struct dmctx *ctx, void *
uci_foreach_sections("qos", "classgroup", s) {
dmuci_get_value_by_section_string(s, "classes", &classes);
classesarr = strsplit(classes, " ", &length);
if (classes != NULL && is_array_elt_exist(classesarr, targetclass, length)) {
if (classes != NULL && elt_exists_in_array(classesarr, targetclass, length)) {
dmasprintf(&classgroup, "%s", section_name(s));
break;
}
@ -3793,7 +3793,7 @@ int get_QoSShaper_Interface(char *refparam, struct dmctx *ctx, void *data, char
uci_foreach_sections("qos", "classgroup", s) {
dmuci_get_value_by_section_string(s, "classes", &classes);
classesarr= strsplit(classes, " ", &length);
if (classes != NULL && is_array_elt_exist(classesarr, section_name(p->config_section), length)){
if (classes != NULL && elt_exists_in_array(classesarr, section_name(p->config_section), length)){
dmasprintf(&classgroup, "%s", section_name(s));
break;
}

View file

@ -977,7 +977,7 @@ char *dm_strword(char *src, char *str)
return NULL;
}
char **strsplit(const char* str, const char* delim, size_t* numtokens)
char **strsplit(const char *str, const char *delim, size_t *numtokens)
{
char *s = strdup(str);
size_t tokens_alloc = 1;
@ -1133,15 +1133,19 @@ char *get_device_from_wifi_iface(const char *wifi_iface, const char *wifi_sectio
* Manage string lists
*/
int is_elt_exit_in_str_list(char *str_list, char *elt)
bool elt_exits_in_str_list(char *str_list, char *elt)
{
char *pch, *spch, *list;
list= dmstrdup(str_list);
if (str_list == NULL || *str_list == '\0')
return false;
char *pch, *spch;
char *list = dmstrdup(str_list);
for (pch = strtok_r(list, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
if(strcmp(pch, elt) == 0)
return 1;
return true;
}
return 0;
return false;
}
void add_elt_to_str_list(char **str_list, char *elt)
@ -1150,50 +1154,57 @@ void add_elt_to_str_list(char **str_list, char *elt)
dmasprintf(str_list, "%s", elt);
return;
}
char *list = dmstrdup(*str_list);
dmfree(*str_list);
*str_list = NULL;
dmasprintf(str_list, "%s %s", list, elt);
}
void remove_elt_from_str_list(char **iface_list, char *ifname)
void remove_elt_from_str_list(char **str_list, char *ifname)
{
char *list = NULL, *tmp = NULL, *pch = NULL, *spch = NULL;
if (*iface_list == NULL || strlen(*iface_list) == 0)
if (*str_list == NULL || strlen(*str_list) == 0)
return;
list = dmstrdup(*iface_list);
dmfree(*iface_list);
*iface_list = NULL;
list = dmstrdup(*str_list);
dmfree(*str_list);
*str_list = NULL;
for (pch = strtok_r(list, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
if (strcmp(pch, ifname) == 0)
continue;
if (tmp == NULL)
dmasprintf(iface_list, "%s", pch);
dmasprintf(str_list, "%s", pch);
else
dmasprintf(iface_list, "%s %s", tmp, pch);
dmasprintf(str_list, "%s %s", tmp, pch);
if (tmp) {
dmfree(tmp);
tmp = NULL;
}
if(*iface_list){
tmp = dmstrdup(*iface_list);
dmfree(*iface_list);
*iface_list = NULL;
if (*str_list) {
tmp = dmstrdup(*str_list);
dmfree(*str_list);
*str_list = NULL;
}
}
dmasprintf(iface_list, "%s", tmp);
dmasprintf(str_list, "%s", tmp ? tmp : "");
}
int is_array_elt_exist(char **str_array, char *str, int length)
bool elt_exists_in_array(char **str_array, char *str, int length)
{
int i;
for (i = 0; i < length; i++){
for (i = 0; i < length; i++) {
if (strcmp(str_array[i], str) == 0)
return 1;
return true;
}
return 0;
return false;
}
int get_shift_time_time(int shift_time, char *local_time, int size)
@ -1555,14 +1566,25 @@ int dm_validate_hexBinary(char *value, struct range_args r_args[], int r_args_si
/* check size */
for (i = 0; i < r_args_size; i++) {
if ((r_args[i].min && r_args[i].max && (atoi(r_args[i].min) == atoi(r_args[i].max)) && (strlen(value) == 2 * atoi(r_args[i].max))) ||
(r_args[i].min && !r_args[i].max && (strlen(value) >= atoi(r_args[i].min))) ||
(!r_args[i].min && r_args[i].max && (strlen(value) <= atoi(r_args[i].max)))) {
return 0;
if (r_args[i].min && r_args[i].max && (atoi(r_args[i].min) == atoi(r_args[i].max))) {
if (strlen(value) == 2 * atoi(r_args[i].max))
break;
if (i == r_args_size - 1)
return -1;
continue;
}
if ((r_args[i].min && !r_args[i].max && (strlen(value) < atoi(r_args[i].min))) ||
(!r_args[i].min && r_args[i].max && (strlen(value) > atoi(r_args[i].max)))) {
return -1;
}
}
return -1;
return 0;
}
static int dm_validate_size_list(int min_item, int max_item, int nbr_item)

View file

@ -296,14 +296,14 @@ char *get_macaddr_from_device(char *device_name);
char *get_macaddr(char *ifname);
char *get_device(char *interface_name);
char *get_l3_device(char *interface_name);
int is_elt_exit_in_str_list(char *str_list, char *elt);
bool elt_exits_in_str_list(char *str_list, char *elt);
void add_elt_to_str_list(char **str_list, char *elt);
void remove_elt_from_str_list(char **iface_list, char *ifname);
struct uci_section *get_origin_section_from_config(char *package, char *section_type, char *orig_section_name);
struct uci_section *get_dup_section_in_dmmap(char *dmmap_package, char *section_type, char *orig_section_name);
struct uci_section *get_dup_section_in_dmmap_opt(char *dmmap_package, char *section_type, char *opt_name, char *opt_value);
struct uci_section *get_dup_section_in_dmmap_eq(char *dmmap_package, char* section_type, char*sect_name, char *opt_name, char* opt_value);
int is_array_elt_exist(char **str_array, char *str, int length);
bool elt_exists_in_array(char **str_array, char *str, int length);
int get_shift_time_time(int shift_time, char *local_time, int size);
int get_shift_time_shift(char *local_time, char *shift);
int command_exec_output_to_array(char *cmd, char **output, int *length);