mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/socket/unixsocket.c (unix_recv_io): prevent FD leak when 2 fd is
sent on LP64 platform. * ext/socket/rubysocket.h (rsock_discard_cmsg_resource): declared. * ext/socket/ancdata.c (rsock_discard_cmsg_resource): renamed from discard_cmsg_resource. export it. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22630 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a898f0fb4b
commit
c17b915eb8
4 changed files with 37 additions and 17 deletions
|
@ -334,6 +334,21 @@ unix_recv_io(int argc, VALUE *argv, VALUE sock)
|
|||
rb_sys_fail("recvmsg(2)");
|
||||
|
||||
#if FD_PASSING_BY_MSG_CONTROL
|
||||
if (arg.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)arg.msg.msg_controllen, (int)sizeof(struct cmsghdr));
|
||||
}
|
||||
if (cmsg.hdr.cmsg_level != SOL_SOCKET) {
|
||||
rb_raise(rb_eSocket,
|
||||
"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 expected)",
|
||||
cmsg.hdr.cmsg_type, SCM_RIGHTS);
|
||||
}
|
||||
if (arg.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)",
|
||||
|
@ -345,20 +360,11 @@ unix_recv_io(int argc, VALUE *argv, VALUE sock)
|
|||
(int)arg.msg.msg_controllen, (int)CMSG_SPACE(sizeof(int)));
|
||||
}
|
||||
if (cmsg.hdr.cmsg_len != CMSG_LEN(sizeof(int))) {
|
||||
rsock_discard_cmsg_resource(&arg.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)));
|
||||
}
|
||||
if (cmsg.hdr.cmsg_level != SOL_SOCKET) {
|
||||
rb_raise(rb_eSocket,
|
||||
"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 expected)",
|
||||
cmsg.hdr.cmsg_type, SCM_RIGHTS);
|
||||
}
|
||||
#else
|
||||
if (arg.msg.msg_accrightslen != sizeof(fd)) {
|
||||
rb_raise(rb_eSocket,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue