Blame SOURCES/autofs-5.1.1-fix-create_client-RPC-client-handling.patch

9ddfc2
autofs-5.1.1 - fix create_client() RPC client handling
9ddfc2
9ddfc2
From: Ian Kent <raven@themaw.net>
9ddfc2
9ddfc2
The autofs socket minimization strategy is to reuse the socket
9ddfc2
descriptor when creating an RPC client for the same protocol.
9ddfc2
9ddfc2
But in create_client() there is a case where the socket descriptor
9ddfc2
can be obtained from RPC client, the RPC client destroyed, but
9ddfc2
not cleared in the persistent data structure.
9ddfc2
9ddfc2
In create_client(), once an attempt is done to get the socket
9ddfc2
descriptor, the RPC client should always be destroyed and cleared
9ddfc2
in the persistent data structure.
9ddfc2
9ddfc2
Signed-off-by: Ian Kent <raven@themaw.net>
9ddfc2
---
9ddfc2
 CHANGELOG      |    1 +
9ddfc2
 lib/rpc_subs.c |   21 ++++++++-------------
9ddfc2
 2 files changed, 9 insertions(+), 13 deletions(-)
9ddfc2
9ddfc2
--- autofs-5.0.7.orig/CHANGELOG
9ddfc2
+++ autofs-5.0.7/CHANGELOG
9ddfc2
@@ -295,6 +295,7 @@
9ddfc2
 - fix prefix option handling in expand_entry().
9ddfc2
 - fix sublink option not set from defaults.
9ddfc2
 - fix error return in do_nfs_mount().
9ddfc2
+- fix create_client() RPC client handling.
9ddfc2
 
9ddfc2
 25/07/2012 autofs-5.0.7
9ddfc2
 =======================
9ddfc2
--- autofs-5.0.7.orig/lib/rpc_subs.c
9ddfc2
+++ autofs-5.0.7/lib/rpc_subs.c
9ddfc2
@@ -663,14 +663,12 @@ static int create_client(struct conn_inf
9ddfc2
 	*client = NULL;
9ddfc2
 
9ddfc2
 	if (info->client) {
9ddfc2
-		if (!clnt_control(info->client, CLGET_FD, (char *) &fd)) {
9ddfc2
-			fd = RPC_ANYSOCK;
9ddfc2
-			clnt_destroy(info->client);
9ddfc2
-			info->client = NULL;
9ddfc2
-		} else {
9ddfc2
+		if (clnt_control(info->client, CLGET_FD, (char *) &fd))
9ddfc2
 			clnt_control(info->client, CLSET_FD_NCLOSE, NULL);
9ddfc2
-			clnt_destroy(info->client);
9ddfc2
-		}
9ddfc2
+		else
9ddfc2
+			fd = RPC_ANYSOCK;
9ddfc2
+		clnt_destroy(info->client);
9ddfc2
+		info->client = NULL;
9ddfc2
 	}
9ddfc2
 
9ddfc2
 	if (info->addr) {
9ddfc2
@@ -686,7 +684,7 @@ static int create_client(struct conn_inf
9ddfc2
 			goto out_close;
9ddfc2
 		}
9ddfc2
 
9ddfc2
-		if (!info->client && fd != RPC_ANYSOCK) {
9ddfc2
+		if (fd != RPC_ANYSOCK) {
9ddfc2
 			close(fd);
9ddfc2
 			fd = RPC_ANYSOCK;
9ddfc2
 		}
9ddfc2
@@ -704,7 +702,6 @@ static int create_client(struct conn_inf
9ddfc2
 	if (ret) {
9ddfc2
 		error(LOGOPT_ANY,
9ddfc2
 		      "hostname lookup failed: %s", gai_strerror(ret));
9ddfc2
-		info->client = NULL;
9ddfc2
 		goto out_close;
9ddfc2
 	}
9ddfc2
 
9ddfc2
@@ -723,7 +720,7 @@ static int create_client(struct conn_inf
9ddfc2
 			goto out_close;
9ddfc2
 		}
9ddfc2
 
9ddfc2
-		if (!info->client && fd != RPC_ANYSOCK) {
9ddfc2
+		if (fd != RPC_ANYSOCK) {
9ddfc2
 			close(fd);
9ddfc2
 			fd = RPC_ANYSOCK;
9ddfc2
 		}
9ddfc2
@@ -735,7 +732,6 @@ static int create_client(struct conn_inf
9ddfc2
 
9ddfc2
 done:
9ddfc2
 	if (!*client) {
9ddfc2
-		info->client = NULL;
9ddfc2
 		ret = -ENOTCONN;
9ddfc2
 		goto out_close;
9ddfc2
 	}
9ddfc2
@@ -743,7 +739,6 @@ done:
9ddfc2
 	/* Close socket fd on destroy, as is default for rpcowned fds */
9ddfc2
 	if  (!clnt_control(*client, CLSET_FD_CLOSE, NULL)) {
9ddfc2
 		clnt_destroy(*client);
9ddfc2
-		info->client = NULL;
9ddfc2
 		ret = -ENOTCONN;
9ddfc2
 		goto out_close;
9ddfc2
 	}
9ddfc2
@@ -751,7 +746,7 @@ done:
9ddfc2
 	return 0;
9ddfc2
 
9ddfc2
 out_close:
9ddfc2
-	if (fd != -1)
9ddfc2
+	if (fd != RPC_ANYSOCK)
9ddfc2
 		close(fd);
9ddfc2
 	return ret;
9ddfc2
 }