chiark / gitweb /
@@@ extra
[mLib] / sys / fdpass.c
index 1db9210de7dbd86abb6c85d7aa93c632740cfc73..e37142e4f4d0eeb236384551e9aa4ba486cd7e3f 100644 (file)
@@ -30,9 +30,6 @@
 #include "config.h"
 
 #include <errno.h>
 #include "config.h"
 
 #include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
 
 #include <sys/types.h>
 #include <sys/time.h>
 
 #include <sys/types.h>
 #include <sys/time.h>
@@ -42,6 +39,7 @@
 #include <sys/un.h>
 
 #include "fdpass.h"
 #include <sys/un.h>
 
 #include "fdpass.h"
+#include "macros.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -68,7 +66,7 @@ ssize_t fdpass_send(int sock, int fd, const void *p, size_t sz)
   struct cmsghdr *cmsg;
 #endif
 
   struct cmsghdr *cmsg;
 #endif
 
-  iov.iov_base = (/*unconst*/ void *)p;
+  iov.iov_base = UNCONST(void, p);
   iov.iov_len = sz;
   msg.msg_name = 0;
   msg.msg_namelen = 0;
   iov.iov_len = sz;
   msg.msg_name = 0;
   msg.msg_namelen = 0;
@@ -104,13 +102,19 @@ ssize_t fdpass_send(int sock, int fd, const void *p, size_t sz)
  *             otherwise it will.  At most one descriptor will be collected.
  */
 
  *             otherwise it will.  At most one descriptor will be collected.
  */
 
+/* Qemu 2.8.1 clobbers 12 bytes beyond the end of the control-message
+ * buffer.  This is fixed in 2.12, but I'll bodge it for the sake of Debian
+ * stable.
+ */
+#define QEMU_SCRATCHSZ 16
+
 ssize_t fdpass_recv(int sock, int *fd, void *p, size_t sz)
 {
   struct iovec iov;
   struct msghdr msg;
   ssize_t rc;
 #ifndef HAVE_MSG_ACCRIGHTS
 ssize_t fdpass_recv(int sock, int *fd, void *p, size_t sz)
 {
   struct iovec iov;
   struct msghdr msg;
   ssize_t rc;
 #ifndef HAVE_MSG_ACCRIGHTS
-  char buf[CMSG_SPACE(sizeof(fd))];
+  char buf[CMSG_SPACE(sizeof(fd)) + QEMU_SCRATCHSZ];
   struct cmsghdr *cmsg;
   int fdtmp;
 #endif
   struct cmsghdr *cmsg;
   int fdtmp;
 #endif
@@ -128,7 +132,7 @@ ssize_t fdpass_recv(int sock, int *fd, void *p, size_t sz)
 #else
   msg.msg_flags = 0;
   msg.msg_control = buf;
 #else
   msg.msg_flags = 0;
   msg.msg_control = buf;
-  msg.msg_controllen = sizeof(buf);
+  msg.msg_controllen = sizeof(buf) - QEMU_SCRATCHSZ;
 #endif
   if ((rc = recvmsg(sock, &msg, 0)) < 0)
     return (rc);
 #endif
   if ((rc = recvmsg(sock, &msg, 0)) < 0)
     return (rc);
@@ -151,4 +155,6 @@ ssize_t fdpass_recv(int sock, int *fd, void *p, size_t sz)
   return (rc);
 }
 
   return (rc);
 }
 
+#undef QEMU_SCRATCHSZ
+
 /*----- That's all, folks -------------------------------------------------*/
 /*----- That's all, folks -------------------------------------------------*/