chiark / gitweb /
@@@ more mess
[mLib] / sys / fdpass.c
index 1db9210de7dbd86abb6c85d7aa93c632740cfc73..b890628029699442ef7f03b4c71d97034a9326cc 100644 (file)
@@ -42,6 +42,7 @@
 #include <sys/un.h>
 
 #include "fdpass.h"
 #include <sys/un.h>
 
 #include "fdpass.h"
+#include "macros.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -68,7 +69,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 +105,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 +135,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 +158,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 -------------------------------------------------*/