summaryrefslogtreecommitdiffstats
path: root/freebsd/sbin/ifconfig
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-31 09:51:36 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-10-31 13:18:49 +0100
commit51c48bff4b61eff8f9133beaedd329e3b3c6e160 (patch)
tree0f511a17fa01bbb0b7d65b9fe3b9977af257cb40 /freebsd/sbin/ifconfig
parentIFCONFIG(8): Wrap exit() (diff)
downloadrtems-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.c18
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);
}