rx: Reorganize LWP rxi_Sendmsg to use 'goto error' 22/14422/2
authorAndrew Deason <adeason@sinenomine.net>
Mon, 2 Nov 2020 19:11:49 +0000 (13:11 -0600)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 11 Dec 2020 04:48:06 +0000 (23:48 -0500)
Our LWP version of rxi_Sendmsg can allocate an fd_set, but we don't
free the fd_set if sendmsg() returns certain errors afterwards.

To make sure we go through the same cleanup code for the different
possible error code paths, reorganize the function to go through a
'goto error'-style destructor. This also makes our return codes a bit
more consistent; we should always return -errno now for errors.

Change-Id: I5eaeb7f4ea1d76acc3bd9c52dc258f53f59f631e
Reviewed-on: https://gerrit.openafs.org/14422
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/rx/rx_lwp.c

index a64f3be..f3378de 100644 (file)
@@ -430,9 +430,9 @@ rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags)
 int
 rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags)
 {
+    int err = 0;
     fd_set *sfds = (fd_set *) 0;
     while (sendmsg(socket, msg_p, flags) == -1) {
-       int err;
 
 #ifdef AFS_NT40_ENV
        err = WSAGetLastError();
@@ -447,7 +447,8 @@ rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags)
            if (!(sfds = IOMGR_AllocFDSet())) {
                (osi_Msg "rx failed to alloc fd_set: ");
                perror("rx_sendmsg");
-               return -1;
+               err = ENOMEM;
+               goto error;
            }
            FD_SET(socket, sfds);
        }
@@ -469,9 +470,7 @@ rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags)
        {
            (osi_Msg "rx failed to send packet: ");
            perror("rx_sendmsg");
-            if (err > 0)
-              return -err;
-           return -1;
+           goto error;
        }
        while ((err = select(
 #ifdef AFS_NT40_ENV
@@ -489,5 +488,12 @@ rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags)
     if (sfds)
        IOMGR_FreeFDSet(sfds);
     return 0;
+
+ error:
+    if (sfds)
+       IOMGR_FreeFDSet(sfds);
+    if (err > 0)
+       return -err;
+    return -1;
 }
 #endif