OSDN Git Service

based on a patch from Atsushi Nemoto:
authorEric Andersen <andersen@codepoet.org>
Sat, 4 Nov 2006 18:33:04 +0000 (18:33 -0000)
committerEric Andersen <andersen@codepoet.org>
Sat, 4 Nov 2006 18:33:04 +0000 (18:33 -0000)
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
libc/sysdeps/linux/mips/bits/socket.h

index cc13c48..2f3dc79 100644 (file)
@@ -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.  */
   };
index 6361dfc..7971667 100644 (file)
@@ -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.  */
   };