--- dhcp-0.10/common.h.salen 2006-07-18 22:17:41.000000000 -0400 +++ dhcp-0.10/common.h 2006-07-18 22:18:40.000000000 -0400 @@ -67,7 +67,7 @@ extern long random_between __P((long, long)); extern int prefix6_mask __P((struct in6_addr *, int)); extern int sa6_plen2mask __P((struct sockaddr_in6 *, int)); -extern char *addr2str __P((struct sockaddr *)); +extern char *addr2str __P((struct sockaddr *, socklen_t)); extern char *in6addr2str __P((struct in6_addr *, int)); extern const char *getdev __P((struct sockaddr_in6 *)); extern int in6_addrscopebyif __P((struct in6_addr *, char *)); --- dhcp-0.10/dhcp6s.c.salen 2006-07-18 22:17:41.000000000 -0400 +++ dhcp-0.10/dhcp6s.c 2006-07-18 22:17:41.000000000 -0400 @@ -569,7 +569,7 @@ dprintf(LOG_DEBUG, "%s" "received %s from %s", FNAME, dhcp6msgstr(dh6->dh6_msgtype), - addr2str((struct sockaddr *)&from)); + addr2str((struct sockaddr *)&from, sizeof(((struct sockaddr *)&from)->sa_data))); dhcp6_init_options(&optinfo); @@ -1056,15 +1056,15 @@ dst.sin6_scope_id = ((struct sockaddr_in6 *)from)->sin6_scope_id; dprintf(LOG_DEBUG, "send destination address is %s, scope id is %d", - addr2str((struct sockaddr *)&dst), dst.sin6_scope_id); + addr2str((struct sockaddr *)&dst, sizeof(dst.sin6_addr)), dst.sin6_scope_id); if (transmit_sa(outsock, &dst, replybuf, len) != 0) { dprintf(LOG_ERR, "%s" "transmit %s to %s failed", FNAME, - dhcp6msgstr(type), addr2str((struct sockaddr *)&dst)); + dhcp6msgstr(type), addr2str((struct sockaddr *)&dst, sizeof(dst.sin6_addr))); return (-1); } dprintf(LOG_DEBUG, "%s" "transmit %s to %s", FNAME, - dhcp6msgstr(type), addr2str((struct sockaddr *)&dst)); + dhcp6msgstr(type), addr2str((struct sockaddr *)&dst, sizeof(dst.sin6_addr))); return 0; } --- dhcp-0.10/dhcp6relay.c.salen 2003-02-27 14:43:08.000000000 -0500 +++ dhcp-0.10/dhcp6relay.c 2006-07-18 22:17:41.000000000 -0400 @@ -496,7 +496,7 @@ } dprintf(LOG_DEBUG, "relay6_recv: from %s, size %d", - addr2str((struct sockaddr *)&from), len); + addr2str((struct sockaddr *)&from, sizeof(from.data)), len); /* get optional information as ancillary data (if available) */ for (cm = (struct cmsghdr *)CMSG_FIRSTHDR(&rmh); cm; @@ -705,7 +705,7 @@ if ((sdev = getdev(&sa6_relay)) == NULL) { dprintf(LOG_WARNING, "relay6_react_advert: can't detect interface from %s", - addr2str((struct sockaddr *)&sa6_relay)); + in6addr2str(&dh6a->dh6adv_relayaddr, 0)); return; } --- dhcp-0.10/dhcp6c.c.salen 2006-07-18 22:17:41.000000000 -0400 +++ dhcp-0.10/dhcp6c.c 2006-07-18 22:17:41.000000000 -0400 @@ -114,6 +114,7 @@ extern struct dhcp6_iaidaddr client6_iaidaddr; FILE *dhcp6_resolv_file; static const struct sockaddr_in6 *sa6_allagent; +static socklen_t sa6_alen; static struct duid client_duid; static void usage __P((void)); @@ -381,7 +382,7 @@ } #endif ((struct sockaddr_in6 *)(res->ai_addr))->sin6_scope_id = ifidx; - dprintf(LOG_DEBUG, "res addr is %s/%d", addr2str(res->ai_addr), res->ai_addrlen); + dprintf(LOG_DEBUG, "res addr is %s/%d", addr2str(res->ai_addr, res->ai_addrlen), res->ai_addrlen); if (bind(insock, res->ai_addr, res->ai_addrlen) < 0) { dprintf(LOG_ERR, "%s" "bind(inbound): %s", FNAME, strerror(errno)); @@ -434,6 +435,7 @@ } memcpy(&sa6_allagent_storage, res->ai_addr, res->ai_addrlen); sa6_allagent = (const struct sockaddr_in6 *)&sa6_allagent_storage; + sa6_alen = res->ai_addrlen; freeaddrinfo(res); /* client interface configuration */ @@ -814,6 +816,7 @@ struct dhcp6_optinfo optinfo; ssize_t optlen, len; struct timeval duration, now; + socklen_t salen; ifp = ev->ifp; @@ -1037,15 +1040,17 @@ exit(1); } memcpy(&dst, res->ai_addr, res->ai_addrlen); + salen = res->ai_addrlen; break; } default: dst = *sa6_allagent; + salen = sa6_alen; break; } dst.sin6_scope_id = ifp->linkid; dprintf(LOG_DEBUG, "send dst if %s addr is %s scope id is %d", - ifp->ifname, addr2str((struct sockaddr *)&dst), ifp->linkid); + ifp->ifname, addr2str((struct sockaddr *)&dst, salen), ifp->linkid); if (sendto(ifp->outsock, buf, len, MSG_DONTROUTE, (struct sockaddr *)&dst, sizeof(dst)) == -1) { dprintf(LOG_ERR, FNAME "transmit failed: %s", strerror(errno)); @@ -1054,7 +1059,7 @@ dprintf(LOG_DEBUG, "%s" "send %s to %s", FNAME, dhcp6msgstr(dh6->dh6_msgtype), - addr2str((struct sockaddr *)&dst)); + addr2str((struct sockaddr *)&dst, salen)); end: dhcp6_clear_options(&optinfo); @@ -1116,7 +1121,7 @@ dprintf(LOG_DEBUG, "%s" "receive %s from %s scope id %d %s", FNAME, dhcp6msgstr(dh6->dh6_msgtype), - addr2str((struct sockaddr *)&from), + addr2str((struct sockaddr *)&from, sizeof (((struct sockaddr *)&from)->sa_data)), ((struct sockaddr_in6 *)&from)->sin6_scope_id, ifp->ifname); @@ -1141,7 +1146,7 @@ default: dprintf(LOG_INFO, "%s" "received an unexpected message (%s) " "from %s", FNAME, dhcp6msgstr(dh6->dh6_msgtype), - addr2str((struct sockaddr *)&from)); + addr2str((struct sockaddr *)&from, sizeof(((struct sockaddr *)&from)->sa_data))); break; } --- dhcp-0.10/common.c.salen 2006-07-18 22:17:41.000000000 -0400 +++ dhcp-0.10/common.c 2006-07-18 22:17:41.000000000 -0400 @@ -560,17 +560,19 @@ } char * -addr2str(sa) +addr2str(sa, salen) struct sockaddr *sa; + socklen_t salen; { - static char addrbuf[8][NI_MAXHOST]; + static char addrbuf[8][NI_MAXHOST+1]; static int round = 0; char *cp; round = (round + 1) & 7; cp = addrbuf[round]; + memset(cp, '\0', NI_MAXHOST+1); - if (getnameinfo(sa, NI_MAXSERV, cp, NI_MAXHOST, NULL, + if (getnameinfo(sa, salen, cp, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) != 0) dprintf(LOG_ERR, "%s getnameinfo return error", FNAME); @@ -589,7 +591,7 @@ sa6.sin6_addr = *in6; sa6.sin6_scope_id = scopeid; - return (addr2str((struct sockaddr *)&sa6)); + return (addr2str((struct sockaddr *)&sa6, sizeof (*in6))); } /* return IPv6 address scope type. caller assumes that smaller is narrower. */ @@ -648,7 +650,7 @@ if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) { warn("in6_matchflags: ioctl(SIOCGIFFLAGS, %s)", - addr2str(addr)); + addr2str(addr, sizeof (addr->sa_data))); close(s); return (-1); }