]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Avoid sillyness if not a valid IPv6 address
authorRoy Marples <roy@marples.name>
Sat, 24 Nov 2012 20:35:53 +0000 (20:35 +0000)
committerRoy Marples <roy@marples.name>
Sat, 24 Nov 2012 20:35:53 +0000 (20:35 +0000)
dhcp.c
ipv6rs.c

diff --git a/dhcp.c b/dhcp.c
index 3a157350cddcd04358029a012747f35edcca0b32..b27e0a2172a1b89ee86d4ac0c591b0e2276ddef9 100644 (file)
--- a/dhcp.c
+++ b/dhcp.c
@@ -1311,7 +1311,9 @@ print_option(char *s, ssize_t len, int type, int dl, const uint8_t *data,
                        while (data < e) {
                                if (l)
                                        l++; /* space */
-                               l += ipv6_printaddr(NULL, 0, data, ifname);
+                               dl = ipv6_printaddr(NULL, 0, data, ifname);
+                               if (dl != -1)
+                                       l += dl;
                                data += 16;
                        }
                        return l + 1;
@@ -1360,7 +1362,11 @@ print_option(char *s, ssize_t len, int type, int dl, const uint8_t *data,
                        l = snprintf(s, len, "%s", inet_ntoa(addr));
                        data += sizeof(addr.s_addr);
                } else if (type & IPV6) {
-                       l = ipv6_printaddr(s, len, data, ifname);
+                       dl = ipv6_printaddr(s, len, data, ifname);
+                       if (dl != -1)
+                               l = dl;
+                       else
+                               l = 0;  
                        data += 16;
                } else if (type & BINHEX) {
                        l = snprintf(s, len, "%.2x", data[0]);
index fc2c3a4c80ceaf728bb1d48736e704f54104d652..d04663ff8a15afb2c2887bea4718b316cb0e52a4 100644 (file)
--- a/ipv6rs.c
+++ b/ipv6rs.c
@@ -382,7 +382,7 @@ add_router(struct ra *router)
 void
 ipv6rs_handledata(_unused void *arg)
 {
-       ssize_t len, l, n, olen;
+       ssize_t len, l, m, n, olen;
        struct cmsghdr *cm;
        int hoplimit;
        struct in6_pktinfo pkt;
@@ -654,22 +654,34 @@ ipv6rs_handledata(_unused void *arg)
                        for (n = ndo->nd_opt_len - 1; n > 1; n -= 2,
                            op += sizeof(addr.s6_addr))
                        {
-                               l += ipv6_printaddr(NULL, 0, op, ifp->name) + 1;
+                               m = ipv6_printaddr(NULL, 0, op, ifp->name);
+                               if (m != -1)
+                                       l += m + 1;
                        }
                        op = (uint8_t *)ndo;
                        op += offsetof(struct nd_opt_rdnss,
                            nd_opt_rdnss_lifetime);
                        op += sizeof(rdnss->nd_opt_rdnss_lifetime);
                        tmp = opt = malloc(l);
-                       for (n = ndo->nd_opt_len - 1; n > 1; n -= 2,
-                           op += sizeof(addr.s6_addr))
-                       {
-                               tmp += ipv6_printaddr(tmp, l, op, ifp->name);
-                               *tmp++ = ' ';
-                               if (lifetime > 0)
-                                       has_dns = 1;
+                       if (opt) {
+                               for (n = ndo->nd_opt_len - 1; n > 1; n -= 2,
+                                   op += sizeof(addr.s6_addr))
+                               {
+                                       m = ipv6_printaddr(tmp, l, op,
+                                           ifp->name);
+                                       if (m != -1) {
+                                               l -= (m + 1);
+                                               tmp += m;
+                                               *tmp++ = ' ';
+                                               if (lifetime > 0)
+                                                       has_dns = 1;
+                                       }
+                               }
+                               if (tmp != opt)
+                                       (*--tmp) = '\0';
+                               else
+                                       *opt = '\0';
                        }
-                       (*--tmp) = '\0';
                        break;
                        
                case ND_OPT_DNSSL: