passfd: fix incorrect sendmsg arguments
authorEric Blake <eblake@redhat.com>
Wed, 30 Mar 2011 20:46:02 +0000 (14:46 -0600)
committerEric Blake <eblake@redhat.com>
Wed, 30 Mar 2011 23:48:24 +0000 (17:48 -0600)
The unit test hung on NetBSD, which pointed out a couple of bugs.

* lib/passfd.c (sendfd): Avoid uninitialized msg_flags field, and
incorrect msg_controllen value.
* modules/passfd-tests (Depends-on): Check for alarm.
* tests/test-passfd.c (main) [HAVE_DECL_ALARM]: Avoid hanging test.
Reported by Bastien ROUCARIES.

Signed-off-by: Eric Blake <eblake@redhat.com>
ChangeLog
lib/passfd.c
modules/passfd-tests
tests/test-passfd.c

index 27f309f..0b7596d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2011-03-30  Eric Blake  <eblake@redhat.com>
+
+       passfd: fix incorrect sendmsg arguments
+       * lib/passfd.c (sendfd): Avoid uninitialized msg_flags field, and
+       incorrect msg_controllen value.
+       * modules/passfd-tests (Depends-on): Check for alarm.
+       * tests/test-passfd.c (main) [HAVE_DECL_ALARM]: Avoid hanging test.
+       Reported by Bastien ROUCARIES.
+
 2011-03-30  Bruno Haible  <bruno@clisp.org>
 
        c-strcasestr: Relicense under LGPLv2+.
index 573b80e..5bf400d 100644 (file)
@@ -47,6 +47,7 @@ sendfd (int sock, int fd)
   struct msghdr msg;
 
   /* send at least one char */
+  memset (&msg, 0, sizeof msg);
   iov[0].iov_base = &send;
   iov[0].iov_len = 1;
   msg.msg_iov = iov;
@@ -67,7 +68,6 @@ sendfd (int sock, int fd)
     cmsg->cmsg_len = CMSG_LEN (sizeof (int));
     /* Initialize the payload: */
     memcpy (CMSG_DATA (cmsg), &fd, sizeof (fd));
-    msg.msg_controllen = cmsg->cmsg_len;
 #elif HAVE_UNIXSOCKET_SCM_RIGHTS_BSD43_WAY
     msg.msg_accrights = &fd;
     msg.msg_accrightslen = sizeof (fd);
index 132679c..477754b 100644 (file)
@@ -5,6 +5,7 @@ tests/macros.h
 Depends-on:
 
 configure.ac:
+AC_CHECK_DECLS_ONCE([alarm])
 
 Makefile.am:
 TESTS += test-passfd
index 2048934..d657ad9 100644 (file)
@@ -19,6 +19,7 @@
 #include "passfd.h"
 
 #include <fcntl.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -40,6 +41,12 @@ main ()
   int fd;
   struct stat st;
 
+#if HAVE_DECL_ALARM
+  /* Avoid hanging on failure.  */
+  signal (SIGALRM, SIG_DFL);
+  alarm (5);
+#endif
+
   fdnull = open ("/dev/null", O_RDWR);
   if (fdnull < 0)
     {