- bsd-user: fix sendmsg(2) emulation w/o ancillary data.

- Bump PORTREVISION.

Submitted by:	sbruno
Obtained from:	ad92220df3
This commit is contained in:
Juergen Lock 2014-10-04 21:39:04 +00:00
parent 01c0b8c01c
commit 90a40bb73b
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=369997
2 changed files with 61 additions and 1 deletions

View file

@ -3,7 +3,7 @@
PORTNAME= qemu PORTNAME= qemu
PORTVERSION= 2.0.2 PORTVERSION= 2.0.2
PORTREVISION= 3 PORTREVISION= 4
CATEGORIES= emulators CATEGORIES= emulators
MASTER_SITES= http://wiki.qemu.org/download/:release \ MASTER_SITES= http://wiki.qemu.org/download/:release \
LOCAL/nox:snapshot LOCAL/nox:snapshot
@ -79,6 +79,7 @@ EXTRA_PATCHES+= ${FILESDIR}/extra-patch-21927cffcc7bcacbb953155f778200846df9f60e
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-freebsd-os-sys.c EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-freebsd-os-sys.c
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-sysctl-hw-physmem EXTRA_PATCHES+= ${FILESDIR}/extra-patch-sysctl-hw-physmem
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-max-arg-pages EXTRA_PATCHES+= ${FILESDIR}/extra-patch-max-arg-pages
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-ad92220df37d1ab3120316fcc436071c78817561
.endif .endif
CONFIGURE_ARGS+= --extra-ldflags=-L${LOCALBASE}/lib CONFIGURE_ARGS+= --extra-ldflags=-L${LOCALBASE}/lib

View file

@ -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) {