diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2011-04-06 10:48:38 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2011-04-06 10:56:25 -0400 |
commit | b57cd77c13831051ad974ae027d96cd88a8d0c59 (patch) | |
tree | e159719948c06a27d2c793928d5636eabe59d500 /utils/mount | |
parent | 502eef09d8050ffb87d394397c2780e1ef042d68 (diff) | |
download | nfs-utils-b57cd77c13831051ad974ae027d96cd88a8d0c59.tar.gz nfs-utils-b57cd77c13831051ad974ae027d96cd88a8d0c59.tar.xz nfs-utils-b57cd77c13831051ad974ae027d96cd88a8d0c59.zip |
mount.nfs: Don't leak socket in nfs_ca_sockname()
Ensure the test socket is always closed before nfs_ca_sockname()
returns. Otherwise it's orphaned.
BugLink: https://bugzilla.linux-nfs.org/show_bug.cgi?id=197
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/mount')
-rw-r--r-- | utils/mount/network.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/utils/mount/network.c b/utils/mount/network.c index 9b6504d..52a5389 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -1095,7 +1095,7 @@ static int nfs_ca_sockname(const struct sockaddr *sap, const socklen_t salen, .sin6_family = AF_INET6, .sin6_addr = IN6ADDR_ANY_INIT, }; - int sock; + int sock, result = 0; sock = socket(sap->sa_family, SOCK_DGRAM, IPPROTO_UDP); if (sock < 0) @@ -1103,28 +1103,26 @@ static int nfs_ca_sockname(const struct sockaddr *sap, const socklen_t salen, switch (sap->sa_family) { case AF_INET: - if (bind(sock, SAFE_SOCKADDR(&sin), sizeof(sin)) < 0) { - close(sock); - return 0; - } + if (bind(sock, SAFE_SOCKADDR(&sin), sizeof(sin)) < 0) + goto out; break; case AF_INET6: - if (bind(sock, SAFE_SOCKADDR(&sin6), sizeof(sin6)) < 0) { - close(sock); - return 0; - } + if (bind(sock, SAFE_SOCKADDR(&sin6), sizeof(sin6)) < 0) + goto out; break; default: errno = EAFNOSUPPORT; - return 0; + goto out; } - if (connect(sock, sap, salen) < 0) { - close(sock); - return 0; - } + if (connect(sock, sap, salen) < 0) + goto out; - return !getsockname(sock, buf, buflen); + result = !getsockname(sock, buf, buflen); + +out: + close(sock); + return result; } /* |