summaryrefslogtreecommitdiffstats
path: root/utils/mount
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2011-04-06 10:48:38 -0400
committerSteve Dickson <steved@redhat.com>2011-04-06 10:56:25 -0400
commitb57cd77c13831051ad974ae027d96cd88a8d0c59 (patch)
treee159719948c06a27d2c793928d5636eabe59d500 /utils/mount
parent502eef09d8050ffb87d394397c2780e1ef042d68 (diff)
downloadnfs-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.c28
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;
}
/*