]> git.ipfire.org Git - thirdparty/gnulib.git/commitdiff
passfd: Fix test failure on FreeBSD >= 12 and NetBSD in 64-bit mode.
authorBruno Haible <bruno@clisp.org>
Wed, 17 Feb 2021 02:22:58 +0000 (03:22 +0100)
committerBruno Haible <bruno@clisp.org>
Wed, 17 Feb 2021 02:22:58 +0000 (03:22 +0100)
* lib/passfd.c (recvfd): Use the CMSG_SPACE macro to compute the value
for msg_controllen.

ChangeLog
lib/passfd.c

index 000690dd551811a8b20f723c94cfca2731063229..44d5dd70d0305f77dde11b2988c722d454d0cb4d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2021-02-16  Bruno Haible  <bruno@clisp.org>
+
+       passfd: Fix test failure on FreeBSD >= 12 and NetBSD in 64-bit mode.
+       * lib/passfd.c (recvfd): Use the CMSG_SPACE macro to compute the value
+       for msg_controllen.
+
 2021-02-16  Paul Eggert  <eggert@cs.ucla.edu>
 
        Port better to macOS Mojave
index ca10ba584bdd1beddeadb201ea3d35363447e2de..a993f395379df6c2f07687d0824d98bfe8f655f6 100644 (file)
@@ -142,19 +142,23 @@ recvfd (int sock, int flags)
   cmsg->cmsg_len = CMSG_LEN (sizeof fd);
   /* Initialize the payload: */
   memcpy (CMSG_DATA (cmsg), &fd, sizeof fd);
-  msg.msg_controllen = cmsg->cmsg_len;
+  msg.msg_controllen = CMSG_SPACE (sizeof fd);
 
   len = recvmsg (sock, &msg, flags_recvmsg);
   if (len < 0)
     return -1;
-
+  if (len == 0)
+    {
+      /* fake errno: at end the file is not available */
+      errno = ENOTCONN;
+      return -1;
+    }
   cmsg = CMSG_FIRSTHDR (&msg);
   /* be paranoiac */
-  if (len == 0 || cmsg == NULL || cmsg->cmsg_len != CMSG_LEN (sizeof fd)
+  if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN (sizeof fd)
       || cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS)
     {
-      /* fake errno: at end the file is not available */
-      errno = len ? EACCES : ENOTCONN;
+      errno = EACCES;
       return -1;
     }