diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-04-28 12:04:23 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-04-28 13:57:46 +0900 |
| commit | e51923778f15c4627dea30ba29e3b3843951c260 (patch) | |
| tree | d421996372cfc1c36852ffb484be4f145ccd3c74 | |
| parent | 468578113ad91878d1da409006d3b3aa73144d21 (diff) | |
| download | mruby-e51923778f15c4627dea30ba29e3b3843951c260.tar.gz mruby-e51923778f15c4627dea30ba29e3b3843951c260.zip | |
Fix `IO#sysread` to update buffer string on `EOF`; ref #4982
| -rw-r--r-- | mrbgems/mruby-io/src/io.c | 28 |
1 files changed, 10 insertions, 18 deletions
diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index a79db4f17..8d278289e 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -927,7 +927,8 @@ mrb_io_sysread_common(mrb_state *mrb, if (RSTRING_LEN(buf) != maxlen) { buf = mrb_str_resize(mrb, buf, maxlen); - } else { + } + else { mrb_str_modify(mrb, RSTRING(buf)); } @@ -936,24 +937,15 @@ mrb_io_sysread_common(mrb_state *mrb, mrb_raise(mrb, E_IO_ERROR, "not opened for reading"); } ret = readfunc(fptr->fd, RSTRING_PTR(buf), (fsize_t)maxlen, offset); - switch (ret) { - case 0: /* EOF */ - if (maxlen == 0) { - buf = mrb_str_new_cstr(mrb, ""); - } else { - mrb_raise(mrb, E_EOF_ERROR, "sysread failed: End of File"); - } - break; - case -1: /* Error */ - mrb_sys_fail(mrb, "sysread failed"); - break; - default: - if (RSTRING_LEN(buf) != ret) { - buf = mrb_str_resize(mrb, buf, ret); - } - break; + if (ret < 0) { + mrb_sys_fail(mrb, "sysread failed"); + } + if (RSTRING_LEN(buf) != ret) { + buf = mrb_str_resize(mrb, buf, ret); + } + if (ret == 0 && maxlen > 0) { + mrb_raise(mrb, E_EOF_ERROR, "sysread failed: End of File"); } - return buf; } |
