ruby-changes:60606
From: Yusuke <ko1@a...>
Date: Tue, 31 Mar 2020 20:19:43 +0900 (JST)
Subject: [ruby-changes:60606] 61b7f86248 (master): ext/socket/init.c: do not return uninitialized buffer
https://git.ruby-lang.org/ruby.git/commit/?id=61b7f86248 From 61b7f86248bd121be2e83768be71ef289e8e5b90 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh <mame@r...> Date: Tue, 31 Mar 2020 20:18:21 +0900 Subject: ext/socket/init.c: do not return uninitialized buffer Resize string buffer only if some data is received in BasicSocket#read_nonblock and some methods. Co-Authored-By: Samuel Williams <samuel.williams@o...> diff --git a/ext/socket/init.c b/ext/socket/init.c index 0675194..6d17ecf 100644 --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -121,6 +121,7 @@ rsock_send_blocking(void *data) https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L121 struct recvfrom_arg { int fd, flags; VALUE str; + size_t length; socklen_t alen; union_sockaddr buf; }; @@ -131,10 +132,11 @@ recvfrom_blocking(void *data) https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L132 struct recvfrom_arg *arg = data; socklen_t len0 = arg->alen; ssize_t ret; - ret = recvfrom(arg->fd, RSTRING_PTR(arg->str), RSTRING_LEN(arg->str), + ret = recvfrom(arg->fd, RSTRING_PTR(arg->str), arg->length, arg->flags, &arg->buf.addr, &arg->alen); if (ret != -1 && len0 < arg->alen) arg->alen = len0; + return (VALUE)ret; } @@ -152,7 +154,6 @@ rsock_strbuf(VALUE str, long buflen) https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L154 } else { rb_str_modify_expand(str, buflen - len); } - rb_str_set_len(str, buflen); return str; } @@ -188,6 +189,7 @@ rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from) https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L189 arg.fd = fptr->fd; arg.alen = (socklen_t)sizeof(arg.buf); arg.str = str; + arg.length = buflen; while (rb_io_check_closed(fptr), rsock_maybe_wait_fd(arg.fd), @@ -198,9 +200,8 @@ rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from) https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L200 } } - if (slen != RSTRING_LEN(str)) { - rb_str_set_len(str, slen); - } + /* Resize the string to the amount of data received */ + rb_str_set_len(str, slen); switch (from) { case RECV_RECV: return str; @@ -330,6 +331,7 @@ rsock_read_nonblock(VALUE sock, VALUE length, VALUE buf, VALUE ex) https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L331 GetOpenFile(sock, fptr); if (len == 0) { + rb_str_set_len(str, 0); return str; } @@ -347,12 +349,9 @@ rsock_read_nonblock(VALUE sock, VALUE length, VALUE buf, VALUE ex) https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L349 rb_syserr_fail_path(e, fptr->pathv); } } - if (len != n) { + if (n != RSTRING_LEN(str)) { rb_str_modify(str); rb_str_set_len(str, n); - if (str != buf) { - rb_str_resize(str, n); - } } if (n == 0) { if (ex == Qfalse) return Qnil; -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/