rx: Reset fd_set in LWP rxi_Sendmsg
authorAndrew Deason <adeason@sinenomine.net>
Mon, 21 Feb 2011 18:39:48 +0000 (12:39 -0600)
committerDerrick Brashear <shadow@dementia.org>
Wed, 16 Mar 2011 14:34:08 +0000 (07:34 -0700)
When we select() on the socket fd in rxi_Sendmsg, we do not reset the
fd_set, and just use the same memory for any necessary subsequent
select()s. However, if the select returned on EINTR, the fd_set may be
cleared, and so we may try to select() on an empty fd_set forever. To
be sure that we don't do that, reset the fd_set to the socket fd every
time.

Reviewed-on: http://gerrit.openafs.org/4028
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
(cherry picked from commit 63fb786c541926dbf03a9452288c6a938c7cd6c4)

Change-Id: Icacbea85a7d1bcb8df538d07ee47de1193826cdc
Reviewed-on: http://gerrit.openafs.org/4180
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>

src/rx/rx_lwp.c

index 7bc7eef..1227bba 100644 (file)
@@ -475,6 +475,8 @@ rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags)
        while ((err = select(socket + 1, 0, sfds, 0, 0)) != 1) {
            if (err >= 0 || errno != EINTR)
                osi_Panic("rxi_sendmsg: select error %d.%d", err, errno);
+           FD_ZERO(sfds);
+           FD_SET(socket, sfds);
        }
     }
     if (sfds)