diff --git a/extmod/network_lwip.c b/extmod/network_lwip.c index 97cb43902d..329a45c46f 100644 --- a/extmod/network_lwip.c +++ b/extmod/network_lwip.c @@ -297,20 +297,23 @@ mp_obj_t mod_network_nic_ipconfig(struct netif *netif, size_t n_args, const mp_o char plain_ip[IPADDR_STRLEN_MAX]; char *split = strchr(input_str, '/'); const char *addr_str = input_str; + int to_copy = MIN(sizeof(plain_ip) - 1, addr_len); + memcpy(plain_ip, addr_str, to_copy); if (split) { - int to_copy = sizeof(plain_ip) - 1; if (split - addr_str < to_copy) { to_copy = split - addr_str; } - memcpy(plain_ip, addr_str, to_copy); mp_obj_t prefix_obj = mp_parse_num_integer(split + 1, strlen(split + 1), 10, NULL); prefix_bits = mp_obj_get_int(prefix_obj); + if (mp_obj_str_get_qstr(args[0]) == MP_QSTR_addr4) { + uint32_t mask = -(1u << (32 - prefix_bits)); + ip_addr_set_ip4_u32_val(netmask, ((mask & 0xFF) << 24) | ((mask & 0xFF00) << 8) | ((mask >> 8) & 0xFF00) | ((mask >> 24) & 0xFF)); + } + } else { + netmask = netif->netmask; } - if (mp_obj_str_get_qstr(args[0]) == MP_QSTR_addr4) { - uint32_t mask = -(1u << (32 - prefix_bits)); - ip_addr_set_ip4_u32_val(netmask, ((mask & 0xFF) << 24) | ((mask & 0xFF00) << 8) | ((mask >> 8) & 0xFF00) | ((mask >> 24) & 0xFF)); - } - if (!ipaddr_aton(addr_str, &ip_addr)) { + plain_ip[to_copy] = '\0'; + if (!ipaddr_aton(plain_ip, &ip_addr)) { mp_raise_ValueError(MP_ERROR_TEXT("invalid arguments")); } if ((mp_obj_str_get_qstr(args[0]) == MP_QSTR_addr6) != IP_IS_V6(&ip_addr)