summaryrefslogtreecommitdiff
path: root/ext/socket/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/socket/init.c')
-rw-r--r--ext/socket/init.c9
1 files changed, 8 insertions, 1 deletions
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