Use the proper size for the cmsg_fd structure on 64-bit plaforms.

This commit is contained in:
Alexandre Julliard 2005-09-16 18:52:47 +00:00
parent 1476116b3a
commit cdf92942b1
2 changed files with 27 additions and 21 deletions

View File

@ -74,9 +74,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(server);
/* data structure used to pass an fd with sendmsg/recvmsg */ /* data structure used to pass an fd with sendmsg/recvmsg */
struct cmsg_fd struct cmsg_fd
{ {
int len; /* size of structure */ struct
{
size_t len; /* size of structure */
int level; /* SOL_SOCKET */ int level; /* SOL_SOCKET */
int type; /* SCM_RIGHTS */ int type; /* SCM_RIGHTS */
} header;
int fd; /* fd to pass */ int fd; /* fd to pass */
}; };
#endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
@ -339,12 +342,12 @@ void wine_server_send_fd( int fd )
msghdr.msg_accrights = (void *)&fd; msghdr.msg_accrights = (void *)&fd;
msghdr.msg_accrightslen = sizeof(fd); msghdr.msg_accrightslen = sizeof(fd);
#else /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #else /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
cmsg.len = sizeof(cmsg); cmsg.header.len = sizeof(cmsg.header) + sizeof(fd);
cmsg.level = SOL_SOCKET; cmsg.header.level = SOL_SOCKET;
cmsg.type = SCM_RIGHTS; cmsg.header.type = SCM_RIGHTS;
cmsg.fd = fd; cmsg.fd = fd;
msghdr.msg_control = &cmsg; msghdr.msg_control = &cmsg;
msghdr.msg_controllen = sizeof(cmsg); msghdr.msg_controllen = sizeof(cmsg.header) + sizeof(fd);
msghdr.msg_flags = 0; msghdr.msg_flags = 0;
#endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
@ -382,12 +385,12 @@ static int receive_fd( obj_handle_t *handle )
struct msghdr msghdr; struct msghdr msghdr;
struct cmsg_fd cmsg; struct cmsg_fd cmsg;
cmsg.len = sizeof(cmsg); cmsg.header.len = sizeof(cmsg.header) + sizeof(fd);
cmsg.level = SOL_SOCKET; cmsg.header.level = SOL_SOCKET;
cmsg.type = SCM_RIGHTS; cmsg.header.type = SCM_RIGHTS;
cmsg.fd = -1; cmsg.fd = -1;
msghdr.msg_control = &cmsg; msghdr.msg_control = &cmsg;
msghdr.msg_controllen = sizeof(cmsg); msghdr.msg_controllen = sizeof(cmsg.header) + sizeof(fd);
msghdr.msg_flags = 0; msghdr.msg_flags = 0;
#endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */

View File

@ -122,12 +122,15 @@ static struct msghdr msghdr;
#ifndef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS #ifndef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
struct cmsg_fd struct cmsg_fd
{ {
int len; /* size of structure */ struct
{
size_t len; /* size of structure */
int level; /* SOL_SOCKET */ int level; /* SOL_SOCKET */
int type; /* SCM_RIGHTS */ int type; /* SCM_RIGHTS */
} header;
int fd; /* fd to pass */ int fd; /* fd to pass */
}; };
static struct cmsg_fd cmsg = { sizeof(cmsg), SOL_SOCKET, SCM_RIGHTS, -1 }; static struct cmsg_fd cmsg = { { sizeof(cmsg.header) + sizeof(cmsg.fd), SOL_SOCKET, SCM_RIGHTS }, -1 };
#endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
/* complain about a protocol error and terminate the client connection */ /* complain about a protocol error and terminate the client connection */
@ -350,7 +353,7 @@ int receive_fd( struct process *process )
msghdr.msg_accrights = (void *)&fd; msghdr.msg_accrights = (void *)&fd;
#else /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #else /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
msghdr.msg_control = &cmsg; msghdr.msg_control = &cmsg;
msghdr.msg_controllen = sizeof(cmsg); msghdr.msg_controllen = sizeof(cmsg.header) + sizeof(fd);
cmsg.fd = -1; cmsg.fd = -1;
#endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
@ -420,7 +423,7 @@ int send_client_fd( struct process *process, int fd, obj_handle_t handle )
msghdr.msg_accrights = (void *)&fd; msghdr.msg_accrights = (void *)&fd;
#else /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #else /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
msghdr.msg_control = &cmsg; msghdr.msg_control = &cmsg;
msghdr.msg_controllen = sizeof(cmsg); msghdr.msg_controllen = sizeof(cmsg.header) + sizeof(fd);
cmsg.fd = fd; cmsg.fd = fd;
#endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */