openbsd-ports/lang/ruby/1.8/patches/patch-ext_socket_socket_c
jeremy 3a030020ea Split the lang/ruby port into separate ports for ruby 1.8 and ruby
1.9, similar to how the lang/python ports are handled.  ruby 1.8
now installs as ruby18 and ruby 1.9 installs as ruby19.  The
included MESSAGE files for both ports let you know the symlinks to
set up if you want to make that version the default system ruby.

Split port originally started by bernd@, many changes since by me,
help and support from jcs@, landry@, jasper@, and sthen@.

This causes a large amount of fallout in dependent ruby ports,
which will be committed shortly.

OK jcs@, landry@, jasper@, sthen@
2010-09-23 21:58:50 +00:00

52 lines
2.2 KiB
Plaintext

$OpenBSD: patch-ext_socket_socket_c,v 1.1 2010/09/23 21:58:50 jeremy Exp $
Fix UnixSocket#recv_io on 64-bit archs, backported from ruby SVN
revisions 22141 and 22633.
--- ext/socket/socket.c.orig Mon Sep 6 17:18:07 2010
+++ ext/socket/socket.c Mon Sep 6 17:18:24 2010
@@ -2097,16 +2097,11 @@ unix_recv_io(argc, argv, sock)
rb_sys_fail("recvmsg(2)");
#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 expected)",
- msg.msg_controllen, CMSG_SPACE(sizeof(int)));
+ if (msg.msg_controllen < sizeof(struct cmsghdr)) {
+ rb_raise(rb_eSocket,
+ "file descriptor was not passed (msg_controllen=%d smaller than sizeof(struct cmsghdr)=%d)",
+ (int)msg.msg_controllen, (int)sizeof(struct cmsghdr));
}
- if (cmsg.hdr.cmsg_len != CMSG_LEN(sizeof(int))) {
- rb_raise(rb_eSocket,
- "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 expected)",
@@ -2116,6 +2111,22 @@ unix_recv_io(argc, argv, sock)
rb_raise(rb_eSocket,
"file descriptor was not passed (cmsg_type=%d, %d expected)",
cmsg.hdr.cmsg_type, SCM_RIGHTS);
+ }
+ if (msg.msg_controllen < CMSG_LEN(sizeof(int))) {
+ rb_raise(rb_eSocket,
+ "file descriptor was not passed (msg_controllen=%d smaller than CMSG_LEN(sizeof(int))=%d)",
+ (int)msg.msg_controllen, (int)CMSG_LEN(sizeof(int)));
+ }
+ if (CMSG_SPACE(sizeof(int)) < msg.msg_controllen) {
+ rb_raise(rb_eSocket,
+ "file descriptor was not passed (msg_controllen=%d bigger than CMSG_SPACE(sizeof(int))=%d)",
+ (int)msg.msg_controllen, (int)CMSG_SPACE(sizeof(int)));
+ }
+ if (cmsg.hdr.cmsg_len != CMSG_LEN(sizeof(int))) {
+ rsock_discard_cmsg_resource(&msg);
+ rb_raise(rb_eSocket,
+ "file descriptor was not passed (cmsg_len=%d, %d expected)",
+ (int)cmsg.hdr.cmsg_len, (int)CMSG_LEN(sizeof(int)));
}
#else
if (msg.msg_accrightslen != sizeof(fd)) {