From 2e09dbcacee815cef140612e0e27bfbc61eeed46 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Sat, 4 Nov 2006 18:33:04 +0000 Subject: based on a patch from Atsushi Nemoto: There is a mismatch of struct msghdr between the kernel and libc. In a 64-bit environment, the size of msg_namelen is 4 for all, but the size of msg_iovlen and msg_controllen is 8 bytes for the kernel and for glibc, but 4 bytes for uClibc. Fix size for the 64bit case. --- libc/sysdeps/linux/common/bits/socket.h | 10 ++++++++++ libc/sysdeps/linux/mips/bits/socket.h | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/libc/sysdeps/linux/common/bits/socket.h b/libc/sysdeps/linux/common/bits/socket.h index cc13c4874..2f3dc797b 100644 --- a/libc/sysdeps/linux/common/bits/socket.h +++ b/libc/sysdeps/linux/common/bits/socket.h @@ -215,16 +215,26 @@ enum /* Note: do not change these members to match glibc; these match the SuSv3 spec already (e.g. msg_iovlen/msg_controllen). http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/socket.h.html */ +/* Note: linux kernel uses __kernel_size_t (which is 8bytes on 64bit + platforms, and 4bytes on 32bit platforms) for msg_iovlen/msg_controllen */ struct msghdr { void *msg_name; /* Address to send to/receive from. */ socklen_t msg_namelen; /* Length of address data. */ struct iovec *msg_iov; /* Vector of data to send/receive into. */ +#if __WORDSIZE == 32 int msg_iovlen; /* Number of elements in the vector. */ +#else + size_t msg_iovlen; /* Number of elements in the vector. */ +#endif void *msg_control; /* Ancillary data (eg BSD filedesc passing). */ +#if __WORDSIZE == 32 socklen_t msg_controllen; /* Ancillary data buffer length. */ +#else + size_t msg_controllen; /* Ancillary data buffer length. */ +#endif int msg_flags; /* Flags on received message. */ }; diff --git a/libc/sysdeps/linux/mips/bits/socket.h b/libc/sysdeps/linux/mips/bits/socket.h index 6361dfc0b..797166762 100644 --- a/libc/sysdeps/linux/mips/bits/socket.h +++ b/libc/sysdeps/linux/mips/bits/socket.h @@ -213,16 +213,29 @@ enum /* Structure describing messages sent by `sendmsg' and received by `recvmsg'. */ +/* Note: do not change these members to match glibc; these match the + SuSv3 spec already (e.g. msg_iovlen/msg_controllen). + http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/socket.h.html */ +/* Note: linux kernel uses __kernel_size_t (which is 8bytes on 64bit + platforms, and 4bytes on 32bit platforms) for msg_iovlen/msg_controllen */ struct msghdr { void *msg_name; /* Address to send to/receive from. */ socklen_t msg_namelen; /* Length of address data. */ struct iovec *msg_iov; /* Vector of data to send/receive into. */ +#if __WORDSIZE == 32 int msg_iovlen; /* Number of elements in the vector. */ +#else + size_t msg_iovlen; /* Number of elements in the vector. */ +#endif void *msg_control; /* Ancillary data (eg BSD filedesc passing). */ +#if __WORDSIZE == 32 socklen_t msg_controllen; /* Ancillary data buffer length. */ +#else + size_t msg_controllen; /* Ancillary data buffer length. */ +#endif int msg_flags; /* Flags on received message. */ }; -- cgit v1.2.3