diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-31 09:51:36 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-10-31 13:18:49 +0100 |
commit | 51c48bff4b61eff8f9133beaedd329e3b3c6e160 (patch) | |
tree | 0f511a17fa01bbb0b7d65b9fe3b9977af257cb40 /freebsd/sbin/ifconfig | |
parent | IFCONFIG(8): Wrap exit() (diff) | |
download | rtems-libbsd-51c48bff4b61eff8f9133beaedd329e3b3c6e160.tar.bz2 |
IFCONFIG(8): Avoid write to const string
Diffstat (limited to 'freebsd/sbin/ifconfig')
-rw-r--r-- | freebsd/sbin/ifconfig/af_inet6.c | 18 |
1 files changed, 14 insertions, 4 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 <net/if.h> #include <err.h> +#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -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); } |