s4/rpc/dns: check for IP address errors at startup
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Thu, 2 May 2019 22:47:28 +0000 (10:47 +1200)
committerDouglas Bagnall <dbagnall@samba.org>
Thu, 9 May 2019 22:39:27 +0000 (22:39 +0000)
The silent failure might leave an indeterminate or zero address.

CID: 1272838

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Gary Lockyer <gary@catalyst.net.nz>
source4/rpc_server/dnsserver/dnsutils.c

index 173988ab318b47f3a18fd1463e3bb8c93b400459..3e8aab2a57315e5365cbd4022070a1949552e483 100644 (file)
@@ -71,17 +71,23 @@ static struct DNS_ADDR_ARRAY *fill_dns_addr_array(TALLOC_CTX *mem_ctx,
        }
 
        for (i = 0; i < num_interfaces; i++) {
+               int ret;
                ipstr = iface_list_n_ip(ifaces, i);
                if (is_ipaddress_v4(ipstr)) {
                        have_ipv4 = true;
                        dns_addr_array->AddrArray[i].MaxSa[0] = 0x02;
-                       inet_pton(AF_INET, ipstr,
-                                 &dns_addr_array->AddrArray[i].MaxSa[4]);
+                       ret = inet_pton(AF_INET, ipstr,
+                                       &dns_addr_array->AddrArray[i].MaxSa[4]);
                } else {
                        have_ipv6 = true;
                        dns_addr_array->AddrArray[i].MaxSa[0] = 0x17;
-                       inet_pton(AF_INET6, ipstr,
-                                 &dns_addr_array->AddrArray[i].MaxSa[8]);
+                       ret = inet_pton(AF_INET6, ipstr,
+                                       &dns_addr_array->AddrArray[i].MaxSa[8]);
+               }
+               if (ret != 1) { /*yep, 1 means success for inet_pton */
+                       DBG_ERR("Interface %d address (%s) is invalid\n",
+                               i, ipstr);
+                       goto nomem;
                }
        }