From 9b02a72d7183f3a76636f1168429e5d229409c66 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 28 Feb 2012 09:33:35 +0000 Subject: * io.c (io_fread, io_getpartial, rb_io_sysread): set buffer size after check if readable, which can cause thread switch. [ruby-dev:45297][Bug #6099] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34846 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- io.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'io.c') diff --git a/io.c b/io.c index f6375cd8db..15b714560e 100644 --- a/io.c +++ b/io.c @@ -1872,11 +1872,14 @@ io_bufread(char *ptr, long len, rb_io_t *fptr) return len - n; } +static void io_setstrbuf(VALUE *str, long len); + static long io_fread(VALUE str, long offset, long size, rb_io_t *fptr) { long len; + io_setstrbuf(&str, offset + size); rb_str_locktmp(str); len = io_bufread(RSTRING_PTR(str) + offset, size, fptr); rb_str_unlocktmp(str); @@ -2208,6 +2211,7 @@ io_getpartial(int argc, VALUE *argv, VALUE io, int nonblock) if (nonblock) { rb_io_set_nonblock(fptr); } + io_setstrbuf(&str, len); rb_str_locktmp(str); n = rb_read_internal(fptr->fd, RSTRING_PTR(str), len); rb_str_unlocktmp(str); @@ -4269,6 +4273,7 @@ rb_io_sysread(int argc, VALUE *argv, VALUE io) rb_thread_wait_fd(fptr->fd); rb_io_check_closed(fptr); + io_setstrbuf(&str, ilen); rb_str_locktmp(str); n = rb_read_internal(fptr->fd, RSTRING_PTR(str), ilen); rb_str_unlocktmp(str); -- cgit v1.2.3