From 51c48bff4b61eff8f9133beaedd329e3b3c6e160 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 31 Oct 2013 09:51:36 +0100 Subject: [PATCH] IFCONFIG(8): Avoid write to const string --- freebsd/sbin/ifconfig/af_inet6.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/freebsd/sbin/ifconfig/af_inet6.c b/freebsd/sbin/ifconfig/af_inet6.c index 0f99a0e9..fb93b419 100644 --- a/freebsd/sbin/ifconfig/af_inet6.c +++ b/freebsd/sbin/ifconfig/af_inet6.c @@ -38,6 +38,7 @@ static const char rcsid[] = #include #include +#include #include #include #include @@ -338,12 +339,20 @@ in6_getprefix(const char *plen, int which) } static void -in6_getaddr(const char *s, int which) +in6_getaddr(const char *cs, int which) { struct sockaddr_in6 *sin = sin6tab[which]; struct addrinfo hints, *res; int error = -1; + char s[64]; + size_t slen = strlen(cs); + if (slen < sizeof(s) - 1 ) { + memcpy(s, cs, slen + 1); + } else { + error = ENAMETOOLONG; + goto done; + } newaddr &= 1; sin->sin6_len = sizeof(*sin); @@ -364,9 +373,10 @@ in6_getaddr(const char *s, int which) hints.ai_family = AF_INET6; error = getaddrinfo(s, NULL, &hints, &res); } +done: if (error != 0) { - if (inet_pton(AF_INET6, s, &sin->sin6_addr) != 1) - errx(1, "%s: bad value", s); + if (inet_pton(AF_INET6, cs, &sin->sin6_addr) != 1) + errx(1, "%s: bad value", cs); } else bcopy(res->ai_addr, sin, res->ai_addrlen); }