This project is closed and read-only.
Backport #7775 ยป sockaddr-ignore-truncated-r38993-to-193.patch
| 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
|
||