From 4f1503e84b2f7bd229a097335e52fb8203f5bb0b Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Wed, 4 Nov 2015 13:58:06 -0500 Subject: [PATCH] Add missing rwlock_unlocks in xprt_register It looks like in b2c9430f46c4ac848957fb8adaac176a3f6ac03f when svc_run switched to poll, an early return was added, but the rwlock was not unlocked. I observed that rpcbind built against libtirpc-1.0.1 would handle only one request before hanging, and tracked it down to a missing rwlock_unlock here. Fixes: b2c9430f46c4 ('Use poll() instead of select() in svc_run()') Signed-off-by: Michael Forney Signed-off-by: Steve Dickson [peda@axentia.se: backport from upstream] Signed-off-by: Peter Rosin --- src/svc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/svc.c b/src/svc.c index 9c41445..b59467b 100644 --- a/src/svc.c +++ b/src/svc.c @@ -99,7 +99,7 @@ xprt_register (xprt) { __svc_xports = (SVCXPRT **) calloc (_rpc_dtablesize(), sizeof (SVCXPRT *)); if (__svc_xports == NULL) - return; + goto unlock; } if (sock < _rpc_dtablesize()) { @@ -120,14 +120,14 @@ xprt_register (xprt) svc_pollfd[i].fd = sock; svc_pollfd[i].events = (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND); - return; + goto unlock; } new_svc_pollfd = (struct pollfd *) realloc (svc_pollfd, sizeof (struct pollfd) * (svc_max_pollfd + 1)); if (new_svc_pollfd == NULL) /* Out of memory */ - return; + goto unlock; svc_pollfd = new_svc_pollfd; ++svc_max_pollfd; @@ -135,6 +135,7 @@ xprt_register (xprt) svc_pollfd[svc_max_pollfd - 1].events = (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND); } +unlock: rwlock_unlock (&svc_fd_lock); } -- 2.5.3