From df691fcdee5dc58a50ffc0e16ec4ce6cef92a2e6 Mon Sep 17 00:00:00 2001 From: Steve Dickson Date: Wed, 4 Nov 2015 14:10:04 -0500 Subject: [PATCH] Add missing rwlock_unlocks in xprt_register (bz 1278149) Signed-off-by: Steve Dickson --- libtirpc-1.0.1-rwlock_unlocks.patch | 54 +++++++++++++++++++++++++++++ libtirpc.spec | 9 ++++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 libtirpc-1.0.1-rwlock_unlocks.patch diff --git a/libtirpc-1.0.1-rwlock_unlocks.patch b/libtirpc-1.0.1-rwlock_unlocks.patch new file mode 100644 index 0000000..770eda3 --- /dev/null +++ b/libtirpc-1.0.1-rwlock_unlocks.patch @@ -0,0 +1,54 @@ +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 +--- + src/svc.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/src/svc.c b/src/svc.c +index 9c41445..82a9a6c 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); + } + diff --git a/libtirpc.spec b/libtirpc.spec index 1afab49..cd45ca0 100644 --- a/libtirpc.spec +++ b/libtirpc.spec @@ -2,7 +2,7 @@ Name: libtirpc Version: 1.0.1 -Release: 0.0%{?dist} +Release: 1%{?dist} Summary: Transport Independent RPC Library Group: System Environment/Libraries License: SISSL and BSD @@ -10,6 +10,8 @@ URL: http://nfsv4.bullopensource.org/ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Source0: http://downloads.sourceforge.net/libtirpc/libtirpc-%{version}.tar.bz2 +Patch001: libtirpc-1.0.1-rwlock_unlocks.patch + BuildRequires: automake, autoconf, libtool, pkgconfig BuildRequires: krb5-devel @@ -39,6 +41,8 @@ developing programs which use the tirpc library. %prep %setup -q +%patch001 -p1 + # Remove .orig files find . -name "*.orig" | xargs rm -f @@ -131,6 +135,9 @@ rm -rf %{buildroot} %{_mandir}/*/* %changelog +* Wed Nov 4 2015 Steve Dickson 1.0.1-1 +- Add missing rwlock_unlocks in xprt_register (bz 1278149) + * Fri Oct 30 2015 Steve Dickson 1.0.1-0.1 - Updated to latest upstream release: libtirpc-1-0-1