From 32b6bd32328a3e3404a8aad53f53243d29c758ae Mon Sep 17 00:00:00 2001 From: akr Date: Wed, 25 Apr 2007 11:00:37 +0000 Subject: * ext/socket/socket.c (unix_send_io, unix_recv_io): use CMSG_DATA to align file descriptor appropriately. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@12218 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/socket/socket.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'ext') diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 4c23a1c178..179c13fce5 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -1956,7 +1956,7 @@ unix_send_io(sock, val) #if FD_PASSING_BY_MSG_CONTROL struct { struct cmsghdr hdr; - int fd; + char pad[8+sizeof(int)+8]; } cmsg; #endif @@ -1986,12 +1986,12 @@ unix_send_io(sock, val) #if FD_PASSING_BY_MSG_CONTROL msg.msg_control = (caddr_t)&cmsg; - msg.msg_controllen = CMSG_SPACE(sizeof(int)); + msg.msg_controllen = CMSG_LEN(sizeof(int)); msg.msg_flags = 0; cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int)); cmsg.hdr.cmsg_level = SOL_SOCKET; cmsg.hdr.cmsg_type = SCM_RIGHTS; - cmsg.fd = fd; + *(int *)CMSG_DATA(&cmsg.hdr) = fd; #else msg.msg_accrights = (caddr_t)&fd; msg.msg_accrightslen = sizeof(fd); @@ -2037,7 +2037,7 @@ unix_recv_io(argc, argv, sock) #if FD_PASSING_BY_MSG_CONTROL struct { struct cmsghdr hdr; - int fd; + char pad[8+sizeof(int)+8]; } cmsg; #endif @@ -2066,7 +2066,7 @@ unix_recv_io(argc, argv, sock) cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int)); cmsg.hdr.cmsg_level = SOL_SOCKET; cmsg.hdr.cmsg_type = SCM_RIGHTS; - cmsg.fd = -1; + *(int *)CMSG_DATA(&cmsg.hdr) = -1; #else msg.msg_accrights = (caddr_t)&fd; msg.msg_accrightslen = sizeof(fd); @@ -2079,22 +2079,22 @@ unix_recv_io(argc, argv, sock) #if FD_PASSING_BY_MSG_CONTROL if (msg.msg_controllen != CMSG_SPACE(sizeof(int))) { rb_raise(rb_eSocket, - "file descriptor was not passed (msg_controllen : %d != %d)", + "file descriptor was not passed (msg_controllen=%d, %d expected)", msg.msg_controllen, CMSG_SPACE(sizeof(int))); } - if (cmsg.hdr.cmsg_len != CMSG_SPACE(0) + sizeof(int)) { + if (cmsg.hdr.cmsg_len != CMSG_LEN(sizeof(int))) { rb_raise(rb_eSocket, - "file descriptor was not passed (cmsg_len : %d != %d)", - cmsg.hdr.cmsg_len, CMSG_SPACE(0) + sizeof(int)); + "file descriptor was not passed (cmsg_len=%d, %d expected)", + cmsg.hdr.cmsg_len, CMSG_LEN(sizeof(int))); } if (cmsg.hdr.cmsg_level != SOL_SOCKET) { rb_raise(rb_eSocket, - "file descriptor was not passed (cmsg_level : %d != %d)", + "file descriptor was not passed (cmsg_level=%d, %d expected)", cmsg.hdr.cmsg_level, SOL_SOCKET); } if (cmsg.hdr.cmsg_type != SCM_RIGHTS) { rb_raise(rb_eSocket, - "file descriptor was not passed (cmsg_type : %d != %d)", + "file descriptor was not passed (cmsg_type=%d, %d expected)", cmsg.hdr.cmsg_type, SCM_RIGHTS); } #else @@ -2106,7 +2106,7 @@ unix_recv_io(argc, argv, sock) #endif #if FD_PASSING_BY_MSG_CONTROL - fd = cmsg.fd; + fd = *(int *)CMSG_DATA(&cmsg.hdr); #endif if (klass == Qnil) -- cgit v1.2.3