summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Lan <jlan@sgi.com>2010-03-25 13:31:10 -0400
committerSteve Dickson <steved@redhat.com>2010-03-25 13:31:10 -0400
commit76fa73d9eda02c17cde0ef739bb5b4f4234d16e5 (patch)
tree732e19f20bd81e33c05cb2f2ca71ae8952c0e98b
parentcd1401995457316ccab5f7d2a9e31237c5c3273f (diff)
downloadti-rpc-76fa73d9eda02c17cde0ef739bb5b4f4234d16e5.tar.gz
Support 64-bit bit mask operations in svc_getreqset()
fd_mask is defined as a long int. On 64-bit platforms, longs are 64 bits wide, so bit mask operations like ffs() do not work as expected. Glibc 2.3 and earlier also had this bug. See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=413450 Reported-by: Jens-Uwe Mozdzen <jmozdzen@nde.de Fix-by: Jay Lan <jlan@sgi.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--src/svc.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/svc.c b/src/svc.c
index cc65e6a..b4a63d0 100644
--- a/src/svc.c
+++ b/src/svc.c
@@ -615,7 +615,7 @@ svc_getreqset (readfds)
maskp = readfds->fds_bits;
for (sock = 0; sock < FD_SETSIZE; sock += NFDBITS)
{
- for (mask = *maskp++; (bit = ffs (mask)) != 0; mask ^= (1 << (bit - 1)))
+ for (mask = *maskp++; (bit = ffsl(mask)) != 0; mask ^= (1L << (bit - 1)))
{
/* sock has input waiting */
fd = sock + bit - 1;