Project

General

Profile

Backport #7775 ยป sockaddr-ignore-truncated-r38993-to-193.patch

akr (Akira Tanaka), 02/03/2013 09:04 PM

View differences:

ext/socket/basicsocket.c (working copy)
{
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);
}
......
{
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);
}
......
{
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);
}
......
{
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);
}
ext/socket/unixsocket.c (working copy)
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);
......
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);
}
ext/socket/init.c (working copy)
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);
......
}
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);
......
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
    (1-1/1)