diff options
author | Andy Fiddaman <illumos@fiddaman.net> | 2022-08-23 11:46:18 +0000 |
---|---|---|
committer | Andy Fiddaman <illumos@fiddaman.net> | 2022-08-30 13:53:32 +0000 |
commit | 2ec63ffb3ec249bd7cb4523118c8437e6c6be335 (patch) | |
tree | 48f4d346df5561b96b52ee18e3be13fba0ee8ebd | |
parent | c893030999f2fcc2a7c0c24c24c735dde06dbd16 (diff) | |
download | illumos-joyent-2ec63ffb3ec249bd7cb4523118c8437e6c6be335.tar.gz |
14930 getallifaddrs() fails in shared IP zone after 3729
Reviewed by: Sebastian Wiedenroth <wiedi@frubar.net>
Reviewed by: Gordon Ross <Gordon.W.Ross@gmail.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Robert Mustacchi <rm@fingolfin.org>
-rw-r--r-- | usr/src/lib/libsocket/inet/getifaddrs.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/usr/src/lib/libsocket/inet/getifaddrs.c b/usr/src/lib/libsocket/inet/getifaddrs.c index 2b379904de..097c56b300 100644 --- a/usr/src/lib/libsocket/inet/getifaddrs.c +++ b/usr/src/lib/libsocket/inet/getifaddrs.c @@ -318,10 +318,9 @@ getallifaddrs(sa_family_t af, struct ifaddrs **ifap, int64_t flags) *ifap = NULL; if ((sock4 = socket(AF_INET, SOCK_DGRAM, 0)) < 0 || - (sock6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0 || - (door_fd = open(DLMGMT_DOOR, O_RDONLY)) < 0 || - (dld_fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) + (sock6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { goto fail; + } bufsize = sizeof (dld_ioc_macaddrget_t) + nmacaddr * sizeof (dld_macaddrinfo_t); @@ -416,6 +415,19 @@ retry: /* add AF_LINK entries */ if (af == AF_UNSPEC || af == AF_LINK) { + /* + * A datalink management door may not be available (for example + * in a shared IP zone). Only enumerate AF_LINK entries if the + * door exists. + */ + door_fd = open(DLMGMT_DOOR, O_RDONLY); + if (door_fd < 0) { + if (errno == ENOENT) + goto nolink; + goto fail; + } + if ((dld_fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0) + goto fail; linkid = DATALINK_INVALID_LINKID; for (;;) { @@ -501,12 +513,15 @@ retry: } } } +nolink: free(buf); free(iomp); (void) close(sock4); (void) close(sock6); - (void) close(door_fd); - (void) close(dld_fd); + if (door_fd >= 0) + (void) close(door_fd); + if (dld_fd >= 0) + (void) close(dld_fd); return (0); fail: err = errno; @@ -517,13 +532,13 @@ fail: if (err == ENXIO) goto retry; - if (sock4 != -1) + if (sock4 >= 0) (void) close(sock4); - if (sock6 != -1) + if (sock6 >= 0) (void) close(sock6); - if (door_fd != -1) + if (door_fd >= 0) (void) close(door_fd); - if (dld_fd != -1) + if (dld_fd >= 0) (void) close(dld_fd); errno = err; return (-1); |