summaryrefslogtreecommitdiff
path: root/emulators/qemu-devel/files
diff options
context:
space:
mode:
Diffstat (limited to 'emulators/qemu-devel/files')
-rw-r--r--emulators/qemu-devel/files/extra-patch-ad92220df37d1ab3120316fcc436071c7881756159
1 files changed, 59 insertions, 0 deletions
diff --git a/emulators/qemu-devel/files/extra-patch-ad92220df37d1ab3120316fcc436071c78817561 b/emulators/qemu-devel/files/extra-patch-ad92220df37d1ab3120316fcc436071c78817561
new file mode 100644
index 000000000000..c627b9be892b
--- /dev/null
+++ b/emulators/qemu-devel/files/extra-patch-ad92220df37d1ab3120316fcc436071c78817561
@@ -0,0 +1,59 @@
+From ad92220df37d1ab3120316fcc436071c78817561 Mon Sep 17 00:00:00 2001
+From: Sean Bruno <sbruno@chips.ysv.freebsd.org>
+Date: Sat, 4 Oct 2014 20:36:32 +0000
+Subject: [PATCH] Ancillary data in the msghdr struct is optional, not
+ mandatory.
+
+If it doesn't exist, that's ok sendmsg() anyway. Fixes pkg repo
+issues now that pkg uses sendmsg.
+---
+ bsd-user/freebsd/os-socket.h | 22 +++++++++++++++++-----
+ 1 file changed, 17 insertions(+), 5 deletions(-)
+
+diff --git a/bsd-user/freebsd/os-socket.h b/bsd-user/freebsd/os-socket.h
+index 9339ffb..a5f5ca7 100644
+--- a/bsd-user/freebsd/os-socket.h
++++ b/bsd-user/freebsd/os-socket.h
+@@ -54,9 +54,15 @@ static inline abi_long do_freebsd_sendmsg(int fd, abi_ulong target_msg,
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+ }
+- msg.msg_controllen = 2 * tswapal(msgp->msg_controllen);
+- msg.msg_control = alloca(msg.msg_controllen);
+- msg.msg_flags = tswap32(msgp->msg_flags);
++ if (tswapal(msgp->msg_controllen) > 0) {
++ msg.msg_controllen = 2 * tswapal(msgp->msg_controllen);
++ msg.msg_control = alloca(msg.msg_controllen);
++ msg.msg_flags = tswap32(msgp->msg_flags);
++ } else {
++ msg.msg_controllen = 0;
++ msg.msg_control = NULL;
++ msg.msg_flags = 0;
++ }
+
+ count = tswapal(msgp->msg_iovlen);
+ vec = alloca(count * sizeof(struct iovec));
+@@ -65,7 +71,10 @@ static inline abi_long do_freebsd_sendmsg(int fd, abi_ulong target_msg,
+ msg.msg_iovlen = count;
+ msg.msg_iov = vec;
+
+- ret = t2h_freebsd_cmsg(&msg, msgp);
++ if (msg.msg_controllen > 0)
++ ret = t2h_freebsd_cmsg(&msg, msgp);
++ else /* no ancillary data */
++ ret = 0;
+ if (!is_error(ret)) {
+ ret = get_errno(sendmsg(fd, &msg, flags));
+ }
+@@ -116,7 +125,10 @@ static inline abi_long do_freebsd_recvmsg(int fd, abi_ulong target_msg,
+ ret = get_errno(recvmsg(fd, &msg, flags));
+ if (!is_error(ret)) {
+ len = ret;
+- ret = h2t_freebsd_cmsg(msgp, &msg);
++ if (msg.msg_controllen > 0)
++ ret = h2t_freebsd_cmsg(msgp, &msg);
++ else /* no ancillary data */
++ ret = 0;
+ if (!is_error(ret)) {
+ msgp->msg_namelen = tswap32(msg.msg_namelen);
+ if (msg.msg_name != NULL) {