diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2020-03-31 11:21:22 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2020-03-31 11:21:22 +0000 |
commit | d0012e50aeab3af26705f62aca542c6834922635 (patch) | |
tree | 416f8d264c6c762297fabe9582436b6bf128dac0 | |
parent | c42b57f24ccf341bde2ec74e6cfbea8ac58d610c (diff) |
merge revision: 61b7f86248bd121be2e83768be71ef289e8e5b90
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@oriontransfer.co.nz>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67875 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ext/socket/init.c | 17 | ||||
-rw-r--r-- | version.h | 6 |
2 files changed, 11 insertions, 12 deletions
diff --git a/ext/socket/init.c b/ext/socket/init.c index 44d1506973..259d3b5996 100644 --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -121,6 +121,7 @@ rsock_send_blocking(void *data) 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) 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) } 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) 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) } } - 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); rb_obj_taint(str); switch (from) { case RECV_RECV: @@ -333,6 +334,7 @@ rsock_read_nonblock(VALUE sock, VALUE length, VALUE buf, VALUE ex) GetOpenFile(sock, fptr); if (len == 0) { + rb_str_set_len(str, 0); return str; } @@ -350,12 +352,9 @@ rsock_read_nonblock(VALUE sock, VALUE length, VALUE buf, VALUE ex) 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; @@ -1,10 +1,10 @@ #define RUBY_VERSION "2.6.6" -#define RUBY_RELEASE_DATE "2020-03-30" -#define RUBY_PATCHLEVEL 145 +#define RUBY_RELEASE_DATE "2020-03-31" +#define RUBY_PATCHLEVEL 146 #define RUBY_RELEASE_YEAR 2020 #define RUBY_RELEASE_MONTH 3 -#define RUBY_RELEASE_DAY 30 +#define RUBY_RELEASE_DAY 31 #include "ruby/version.h" |