svn commit: r301643 - stable/9/usr.sbin/rpcbind
Garrett Cooper
ngie at FreeBSD.org
Wed Jun 8 17:04:16 UTC 2016
Author: ngie
Date: Wed Jun 8 17:04:15 2016
New Revision: 301643
URL: https://svnweb.freebsd.org/changeset/base/301643
Log:
MFC r300932,r300934,r300941,r300972,r300973:
r300932:
Catch malloc(3) errors and socket(2) errors
- malloc failing will result in a delayed segfault
- socket failing will result in delayed failures with setsockopt
Exit in the event that either of these high-level conditions are met.
CID: 976288, 976321, 976858
r300934:
Plug leak with ifp by calling freeifaddrs after calling getifaddrs
Obtained from: NetBSD v1.18
r300941:
Don't leak res in network_init(..)
Call freeaddrinfo on it after it's been used
CID: 1225050
r300972 (by markj):
Fix rpcbind init after r300941.
- getaddrinfo() sets res = NULL on failure and freeaddrinfo() always
dereferences its argument, so we should only free the address list after
a successful call.
- Address a second potential leak caused by getaddrinfo(AF_INET6)
overwriting the address list returned by getaddrinfo(AF_INET).
X-MFC-With: r300941
r300973:
Follow up to r300932
In the event MK_INET6 != no in userspace, but is disabled in the
kernel, or if there aren't any IPv6 addresses configured in userspace
(for lo0 and all physical interfaces), rpcbind would terminate
immediately instead of silently failing on
Skip over the IPv6 block to its respective cleanup with freeifaddrs if
creating the socket failed instead of terminating rpcbind immediately
Modified:
stable/9/usr.sbin/rpcbind/util.c
Directory Properties:
stable/9/ (props changed)
stable/9/usr.sbin/ (props changed)
Modified: stable/9/usr.sbin/rpcbind/util.c
==============================================================================
--- stable/9/usr.sbin/rpcbind/util.c Wed Jun 8 16:59:09 2016 (r301642)
+++ stable/9/usr.sbin/rpcbind/util.c Wed Jun 8 17:04:15 2016 (r301643)
@@ -354,8 +354,10 @@ network_init(void)
if (local_in4 == NULL) {
if (debugging)
fprintf(stderr, "can't alloc local ip4 addr\n");
+ exit(1);
}
memcpy(local_in4, res->ai_addr, sizeof *local_in4);
+ freeaddrinfo(res);
}
#ifdef INET6
@@ -369,8 +371,10 @@ network_init(void)
if (local_in6 == NULL) {
if (debugging)
fprintf(stderr, "can't alloc local ip6 addr\n");
+ exit(1);
}
memcpy(local_in6, res->ai_addr, sizeof *local_in6);
+ freeaddrinfo(res);
}
/*
@@ -383,6 +387,11 @@ network_init(void)
inet_pton(AF_INET6, RPCB_MULTICAST_ADDR, &mreq6.ipv6mr_multiaddr);
s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
+ if (s == -1) {
+ if (debugging)
+ fprintf(stderr, "couldn't create ip6 socket");
+ goto done_inet6;
+ }
/*
* Loop through all interfaces. For each IPv6 multicast-capable
@@ -404,6 +413,8 @@ network_init(void)
if (debugging)
perror("setsockopt v6 multicast");
}
+done_inet6:
+ freeifaddrs(ifp);
#endif
/* close(s); */
More information about the svn-src-stable-9
mailing list