diff --git a/bsd-user/freebsd/os-socket.h b/bsd-user/freebsd/os-socket.h index 9339ffb0a8..a5f5ca7128 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) {