From 828551f86ce9a2dd0c1a8af39c8ac99ecc0859a0 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Tue, 20 Oct 2015 16:03:02 +0900 Subject: off_t can be larger than mrb_int. --- src/io.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/io.c b/src/io.c index ae7402b02..bcc6ea64e 100644 --- a/src/io.c +++ b/src/io.c @@ -525,7 +525,8 @@ mrb_value mrb_io_sysseek(mrb_state *mrb, mrb_value io) { struct mrb_io *fptr; - mrb_int pos, offset, whence = -1; + off_t pos; + mrb_int offset, whence = -1; mrb_get_args(mrb, "i|i", &offset, &whence); if (whence < 0) { @@ -534,11 +535,14 @@ mrb_io_sysseek(mrb_state *mrb, mrb_value io) fptr = (struct mrb_io *)mrb_get_datatype(mrb, io, &mrb_io_type); pos = lseek(fptr->fd, offset, whence); - if (pos < 0) { + if (pos == -1) { mrb_sys_fail(mrb, "sysseek"); } - - return mrb_fixnum_value(pos); + if (pos > MRB_INT_MAX) { + return mrb_float_value(mrb, (mrb_float)pos); + } else { + return mrb_fixnum_value(pos); + } } mrb_value -- cgit v1.2.3