diff options
author | Andrew Stormont <astormont@racktopsystems.com> | 2017-06-28 00:53:45 +0100 |
---|---|---|
committer | Dan McDonald <danmcd@joyent.com> | 2017-07-10 09:13:05 -0400 |
commit | 51c62b7bcb67b1e65d7e2773b20f465cf58b91b2 (patch) | |
tree | 8ce2c5a3182cfeb7b12339431b67a6dddaedc558 /usr/src/lib/libsocket/inet | |
parent | 1ee1bcba6f9a17099e11b5bb0d1eeab71c729aa3 (diff) | |
download | illumos-joyent-51c62b7bcb67b1e65d7e2773b20f465cf58b91b2.tar.gz |
8429 getallifaddrs dereferences invalid pointer causing SIGSEGV
Reviewed by: Sebastian Wiedenroth <sw@core.io>
Reviewed by: Yuri Pankov <yuripv@gmx.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src/lib/libsocket/inet')
-rw-r--r-- | usr/src/lib/libsocket/inet/getifaddrs.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/usr/src/lib/libsocket/inet/getifaddrs.c b/usr/src/lib/libsocket/inet/getifaddrs.c index df6d4199d1..66dfedbd10 100644 --- a/usr/src/lib/libsocket/inet/getifaddrs.c +++ b/usr/src/lib/libsocket/inet/getifaddrs.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2017 RackTop Systems. */ #include <netdb.h> @@ -102,6 +103,14 @@ getallifaddrs(sa_family_t af, struct ifaddrs **ifap, int64_t flags) int sock6; int err; + /* + * Initialize ifap to NULL so we can safely call freeifaddrs + * on it in case of error. + */ + if (ifap == NULL) + return (EINVAL); + *ifap = NULL; + if ((sock4 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return (-1); if ((sock6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { @@ -123,7 +132,6 @@ retry: */ prev = NULL; lifrp = buf; - *ifap = NULL; for (n = 0; n < numifs; n++, lifrp++) { /* Prepare for the ioctl call */ |