diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-02-06 05:21:33 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-02-06 05:21:33 +0000 |
commit | 2618ffc57afe05308128e6ddf2b7fd2aae32b393 (patch) | |
tree | f0c6dd76ceb68df166dea14b489ad73b001eaa7b | |
parent | 0297247f978c12ff9739642427f4d4798d019cb2 (diff) |
merge revision(s) 38993: [Backport #7775]
* ext/socket/basicsocket.c (bsock_getsockname): ignore truncated
part of socket address.
(bsock_getpeername): ditto.
(bsock_local_address): ditto.
(bsock_remote_address): ditto.
* ext/socket/unixsocket.c (unix_path): ditto.
(unix_addr): ditto.
(unix_peeraddr): ditto.
* ext/socket/init.c (cloexec_accept): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@39094 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | ext/socket/basicsocket.c | 8 | ||||
-rw-r--r-- | ext/socket/init.c | 9 | ||||
-rw-r--r-- | ext/socket/unixsocket.c | 4 | ||||
-rw-r--r-- | version.h | 2 |
5 files changed, 35 insertions, 2 deletions
@@ -1,3 +1,17 @@ +Wed Feb 6 14:20:12 2013 Tanaka Akira <akr@fsij.org> + + * ext/socket/basicsocket.c (bsock_getsockname): ignore truncated + part of socket address. + (bsock_getpeername): ditto. + (bsock_local_address): ditto. + (bsock_remote_address): ditto. + + * ext/socket/unixsocket.c (unix_path): ditto. + (unix_addr): ditto. + (unix_peeraddr): ditto. + + * ext/socket/init.c (cloexec_accept): ditto. + Wed Feb 6 14:19:07 2013 Kouhei Sutou <kou@cozmixng.org> * lib/rexml/parsers/baseparser.rb, test/rexml/test_comment.rb: diff --git a/ext/socket/basicsocket.c b/ext/socket/basicsocket.c index b997043620..6f942e3a55 100644 --- a/ext/socket/basicsocket.c +++ b/ext/socket/basicsocket.c @@ -358,11 +358,13 @@ bsock_getsockname(VALUE sock) { struct sockaddr_storage buf; socklen_t len = (socklen_t)sizeof buf; + socklen_t len0 = len; rb_io_t *fptr; GetOpenFile(sock, fptr); if (getsockname(fptr->fd, (struct sockaddr*)&buf, &len) < 0) rb_sys_fail("getsockname(2)"); + if (len0 < len) len = len0; return rb_str_new((char*)&buf, len); } @@ -387,11 +389,13 @@ bsock_getpeername(VALUE sock) { struct sockaddr_storage buf; socklen_t len = (socklen_t)sizeof buf; + socklen_t len0 = len; rb_io_t *fptr; GetOpenFile(sock, fptr); if (getpeername(fptr->fd, (struct sockaddr*)&buf, &len) < 0) rb_sys_fail("getpeername(2)"); + if (len0 < len) len = len0; return rb_str_new((char*)&buf, len); } @@ -475,11 +479,13 @@ bsock_local_address(VALUE sock) { struct sockaddr_storage buf; socklen_t len = (socklen_t)sizeof buf; + socklen_t len0 = len; rb_io_t *fptr; GetOpenFile(sock, fptr); if (getsockname(fptr->fd, (struct sockaddr*)&buf, &len) < 0) rb_sys_fail("getsockname(2)"); + if (len0 < len) len = len0; return rsock_fd_socket_addrinfo(fptr->fd, (struct sockaddr *)&buf, len); } @@ -507,11 +513,13 @@ bsock_remote_address(VALUE sock) { struct sockaddr_storage buf; socklen_t len = (socklen_t)sizeof buf; + socklen_t len0 = len; rb_io_t *fptr; GetOpenFile(sock, fptr); if (getpeername(fptr->fd, (struct sockaddr*)&buf, &len) < 0) rb_sys_fail("getpeername(2)"); + if (len0 < len) len = len0; return rsock_fd_socket_addrinfo(fptr->fd, (struct sockaddr *)&buf, len); } diff --git a/ext/socket/init.c b/ext/socket/init.c index 0a2365850f..54452e4b99 100644 --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -448,6 +448,7 @@ VALUE rsock_s_accept_nonblock(VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len) { int fd2; + socklen_t len0 = len ? *len : 0; rb_secure(3); rb_io_set_nonblock(fptr); @@ -466,6 +467,7 @@ rsock_s_accept_nonblock(VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, s } rb_sys_fail("accept(2)"); } + if (len && len0 < *len) *len = len0; rb_update_max_fd(fd2); make_fd_nonblock(fd2); return rsock_init_sock(rb_obj_alloc(klass), fd2); @@ -481,7 +483,12 @@ static VALUE accept_blocking(void *data) { struct accept_arg *arg = data; - return (VALUE)accept(arg->fd, arg->sockaddr, arg->len); + int ret; + socklen_t len0 = 0; + if (arg->len) len0 = *arg->len; + ret = accept(arg->fd, arg->sockaddr, arg->len); + if (arg->len && len0 < *arg->len) *arg->len = len0; + return (VALUE)ret; } VALUE diff --git a/ext/socket/unixsocket.c b/ext/socket/unixsocket.c index 26822e5b4f..28defbb263 100644 --- a/ext/socket/unixsocket.c +++ b/ext/socket/unixsocket.c @@ -116,8 +116,10 @@ unix_path(VALUE sock) if (NIL_P(fptr->pathv)) { struct sockaddr_un addr; socklen_t len = (socklen_t)sizeof(addr); + socklen_t len0 = len; if (getsockname(fptr->fd, (struct sockaddr*)&addr, &len) < 0) rb_sys_fail(0); + if (len0 < len) len = len0; fptr->pathv = rb_obj_freeze(rb_str_new_cstr(rsock_unixpath(&addr, len))); } return rb_str_dup(fptr->pathv); @@ -445,11 +447,13 @@ unix_peeraddr(VALUE sock) rb_io_t *fptr; struct sockaddr_un addr; socklen_t len = (socklen_t)sizeof addr; + socklen_t len0 = len; GetOpenFile(sock, fptr); if (getpeername(fptr->fd, (struct sockaddr*)&addr, &len) < 0) rb_sys_fail("getpeername(2)"); + if (len0 < len) len = len0; return rsock_unixaddr(&addr, len); } @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.3" -#define RUBY_PATCHLEVEL 379 +#define RUBY_PATCHLEVEL 380 #define RUBY_RELEASE_DATE "2013-02-06" #define RUBY_RELEASE_YEAR 2013 |