+283380093ca4669ba4c65ebade4fe8b98e62582c diff -uNr nm1/src/netmgr.c nm2/src/netmgr.c --- nm1/src/netmgr.c 2017-08-09 22:30:17.449535947 +0000 +++ nm2/src/netmgr.c 2017-08-09 22:29:57.662725748 +0000 @@ -328,9 +328,15 @@ SECTION_MATCH, KEY_NAME, &pszMatchName); + if ((err == NM_ERR_VALUE_NOT_FOUND) || + (err == NM_ERR_BAD_CONFIG_FILE)) + { + /* Ignore cfg file with invalid/missing Match section */ + err = 0; + } bail_on_error(err); - if (nm_regex_match_ifname(pszIfName, pszMatchName) == 0) + if (pszMatchName && !nm_regex_match_ifname(pszIfName, pszMatchName)) { if (pszCfgFileName == NULL) { @@ -2121,11 +2127,20 @@ { rtMsg = (struct rtmsg *)NLMSG_DATA(((struct nlmsghdr *)nlMsg)); // TODO: Figure out IPv6 - if ((rtMsg->rtm_table != RT_TABLE_MAIN) || + if (rtMsg->rtm_table != RT_TABLE_MAIN) + { + continue; + } + if (((addrType == STATIC_IPV4) || (addrType == DHCP_IPV4)) && (rtMsg->rtm_family != AF_INET)) { continue; } + if (((addrType == STATIC_IPV6) || (addrType == DHCP_IPV6) || + (addrType == AUTO_IPV6)) && (rtMsg->rtm_family != AF_INET6)) + { + continue; + } rtAttr = (struct rtattr *)RTM_RTA(rtMsg); rtLen = RTM_PAYLOAD(nlMsg); for (; RTA_OK(rtAttr, rtLen); rtAttr = RTA_NEXT(rtAttr, rtLen)) @@ -2136,27 +2151,36 @@ if_indextoname(*(int *)RTA_DATA(rtAttr), szIfName); break; case RTA_GATEWAY: - gw4.s_addr = *(uint32_t *)RTA_DATA(rtAttr); + if (rtMsg->rtm_family == AF_INET) + { + gw4.s_addr = *(uint32_t *)RTA_DATA(rtAttr); + } break; case RTA_DST: - dst4.s_addr = *(uint32_t *)RTA_DATA(rtAttr); + if (rtMsg->rtm_family == AF_INET) + { + dst4.s_addr = *(uint32_t *)RTA_DATA(rtAttr); + } break; default: break; } } - if ((dst4.s_addr == 0) && !strcmp(szIfName, pszInterfaceName)) + if ((addrType == STATIC_IPV4) || (addrType == DHCP_IPV4)) { - if (inet_ntop(AF_INET, &gw4, szGateway, INET6_ADDRSTRLEN) != NULL) - { - err = netmgr_alloc_string(szGateway, &pszGateway); - } - else + if ((dst4.s_addr == 0) && !strcmp(szIfName, pszInterfaceName)) { - err = errno; + if (inet_ntop(AF_INET, &gw4, szGateway, INET6_ADDRSTRLEN) != NULL) + { + err = netmgr_alloc_string(szGateway, &pszGateway); + } + else + { + err = errno; + } + bail_on_error(err); + break; } - bail_on_error(err); - break; } } @@ -3054,10 +3078,18 @@ { *ppszIPv4AddrPrefix = pszIPv4AddrPrefix; } + else + { + netmgr_free(pszIPv4AddrPrefix); + } if (ppszIPv4Gateway) { *ppszIPv4Gateway = pszIPv4Gateway; } + else + { + netmgr_free(pszIPv4Gateway); + } cleanup: netmgr_list_free(ipCount, (void **)ppszIpAddrList);