From 2618ffc57afe05308128e6ddf2b7fd2aae32b393 Mon Sep 17 00:00:00 2001 From: usa Date: Wed, 6 Feb 2013 05:21:33 +0000 Subject: 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 --- ext/socket/basicsocket.c | 8 ++++++++ ext/socket/init.c | 9 ++++++++- ext/socket/unixsocket.c | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) (limited to 'ext') 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); } -- cgit v1.2.3