diff options
| author | Roy Marples <roy@marples.name> | 2012-11-24 20:36:20 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2012-11-24 20:36:20 +0000 |
| commit | 9664cc0e6c1924947de0e26716c74c9d43992290 (patch) | |
| tree | 512a41c0728b57c727e7219ac00107cf0bd77999 | |
| parent | 586e542cb3231d44d2924fd8de695d82c3236b62 (diff) | |
| download | dhcpcd-9664cc0e6c1924947de0e26716c74c9d43992290.tar.xz | |
Avoid sillyness if not a valid IPv6 address
| -rw-r--r-- | ipv6rs.c | 32 |
1 files changed, 22 insertions, 10 deletions
@@ -378,7 +378,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; @@ -632,22 +632,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: |
