summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-03 04:39:50 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-03 04:39:50 +0000
commit47264c4e1ffbc34fdd83b8bada241990433d9ee3 (patch)
tree142f528e554bc695fbe0f9f432c7ee8e7811abee /io.c
parent0187f76a676cb545106e6d5d6fdb8f2d060261a4 (diff)
merge revision(s) 46151,46165: [Backport #9865]
* io.c (rb_io_fileno, rb_io_inspect): non-modification does not error on frozen IO. [ruby-dev:48241] [Bug #9865] * io.c (rb_io_autoclose_p): Don't raise on frozen IO. * test/lib/minitest/unit.rb: IO#autoclose? may raise IOError. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@47368 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/io.c b/io.c
index 13987e1b84..48ab45569e 100644
--- a/io.c
+++ b/io.c
@@ -583,12 +583,18 @@ rb_eof_error(void)
rb_raise(rb_eEOFError, "end of file reached");
}
-VALUE
-rb_io_taint_check(VALUE io)
+static VALUE
+taint_check(VALUE io)
{
if (!OBJ_UNTRUSTED(io) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: operation on trusted IO");
- rb_check_frozen(io);
+ return io;
+}
+
+VALUE
+rb_io_taint_check(VALUE io)
+{
+ rb_check_frozen(taint_check(io));
return io;
}
@@ -1877,10 +1883,10 @@ rb_io_fdatasync(VALUE io)
static VALUE
rb_io_fileno(VALUE io)
{
- rb_io_t *fptr;
+ rb_io_t *fptr = RFILE(io)->fptr;
int fd;
- GetOpenFile(io, fptr);
+ rb_io_check_closed(fptr);
fd = fptr->fd;
return INT2FIX(fd);
}
@@ -1932,7 +1938,7 @@ rb_io_inspect(VALUE obj)
VALUE result;
static const char closed[] = " (closed)";
- fptr = RFILE(rb_io_taint_check(obj))->fptr;
+ fptr = RFILE(taint_check(obj))->fptr;
if (!fptr) return rb_any_to_s(obj);
result = rb_str_new_cstr("#<");
rb_str_append(result, rb_class_name(CLASS_OF(obj)));
@@ -7452,9 +7458,9 @@ rb_io_s_for_fd(int argc, VALUE *argv, VALUE klass)
static VALUE
rb_io_autoclose_p(VALUE io)
{
- rb_io_t *fptr;
+ rb_io_t *fptr = RFILE(io)->fptr;
rb_secure(4);
- GetOpenFile(io, fptr);
+ rb_io_check_closed(fptr);
return (fptr->mode & FMODE_PREP) ? Qfalse : Qtrue;
}