summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-04-28 12:04:23 +0900
committerHiroshi Mimaki <[email protected]>2020-05-01 16:54:13 +0900
commita2b87c033a3239e0d9c5fce1166d2d653ab5704f (patch)
tree75061d6ca513410afcd55341b24adf3e4cb3548d
parentb3c5d94bd1e51b7eb7647735ee3e9cba4e16d5e1 (diff)
downloadmruby-a2b87c033a3239e0d9c5fce1166d2d653ab5704f.tar.gz
mruby-a2b87c033a3239e0d9c5fce1166d2d653ab5704f.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 8b0dcb244..e05149014 100644
--- a/mrbgems/mruby-io/src/io.c
+++ b/mrbgems/mruby-io/src/io.c
@@ -889,7 +889,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));
}
@@ -898,24 +899,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;
}