forked from pool/libtirpc
Marcus Meissner
dc7d719fc1
fix socket leak introduced by change rpc protocol version patch (bsc#1087925) OBS-URL: https://build.opensuse.org/request/show/597811 OBS-URL: https://build.opensuse.org/package/show/Base:System/libtirpc?expand=0&rev=73
74 lines
2.0 KiB
Diff
74 lines
2.0 KiB
Diff
From 25d38d744997d5ff03d8b0f2cdd79c0fb7185cca Mon Sep 17 00:00:00 2001
|
|
From: Thomas Blume <Thomas.Blume@suse.com>
|
|
Date: Wed, 18 Apr 2018 08:44:49 -0400
|
|
Subject: [PATCH] Fix regression introduced by change rpc version order patch
|
|
|
|
Fix a socket leak introduced by commit 5e7b57bc20bd9cadff
|
|
(rpcinfo: change order of version to be tried to 4, 3, 2)
|
|
The new function __try_protocol_version_2 doesn't return
|
|
the client, so it can't be closed via CLNT_DESTROY in the
|
|
calling function.
|
|
|
|
Signed-off-by: Thomas Blume <Thomas.Blume@suse.com>
|
|
Signed-off-by: Steve Dickson <steved@redhat.com>
|
|
---
|
|
src/rpcb_clnt.c | 18 ++++++++++++++----
|
|
1 file changed, 14 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
|
|
index a94fc73..4b44364 100644
|
|
--- a/src/rpcb_clnt.c
|
|
+++ b/src/rpcb_clnt.c
|
|
@@ -752,7 +752,7 @@ __try_protocol_version_2(program, version, nconf, host, tp)
|
|
|
|
client = getpmaphandle(nconf, host, &parms.r_addr);
|
|
if (client == NULL)
|
|
- return (NULL);
|
|
+ goto error;
|
|
|
|
/*
|
|
* Set retry timeout.
|
|
@@ -771,11 +771,11 @@ __try_protocol_version_2(program, version, nconf, host, tp)
|
|
if (clnt_st != RPC_SUCCESS) {
|
|
rpc_createerr.cf_stat = RPC_PMAPFAILURE;
|
|
clnt_geterr(client, &rpc_createerr.cf_error);
|
|
- return (NULL);
|
|
+ goto error;
|
|
} else if (port == 0) {
|
|
pmapaddress = NULL;
|
|
rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED;
|
|
- return (NULL);
|
|
+ goto error;
|
|
}
|
|
port = htons(port);
|
|
CLNT_CONTROL(client, CLGET_SVC_ADDR, (char *)&remote);
|
|
@@ -789,14 +789,24 @@ __try_protocol_version_2(program, version, nconf, host, tp)
|
|
free(pmapaddress);
|
|
pmapaddress = NULL;
|
|
}
|
|
- return (NULL);
|
|
+ goto error;
|
|
}
|
|
memcpy(pmapaddress->buf, remote.buf, remote.len);
|
|
memcpy(&((char *)pmapaddress->buf)[sizeof (short)],
|
|
(char *)(void *)&port, sizeof (short));
|
|
pmapaddress->len = pmapaddress->maxlen = remote.len;
|
|
|
|
+ CLNT_DESTROY(client);
|
|
return pmapaddress;
|
|
+
|
|
+error:
|
|
+ if (client) {
|
|
+ CLNT_DESTROY(client);
|
|
+ client = NULL;
|
|
+
|
|
+ }
|
|
+ return (NULL);
|
|
+
|
|
}
|
|
#endif
|
|
|
|
--
|
|
2.13.6
|
|
|