summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-04-28 12:04:23 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-04-28 13:57:46 +0900
commite51923778f15c4627dea30ba29e3b3843951c260 (patch)
treed421996372cfc1c36852ffb484be4f145ccd3c74
parent468578113ad91878d1da409006d3b3aa73144d21 (diff)
downloadmruby-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.c28
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;
}