summaryrefslogtreecommitdiff
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
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
-rw-r--r--ChangeLog11
-rw-r--r--io.c22
-rw-r--r--test/ruby/test_io.rb17
-rw-r--r--version.h2
4 files changed, 43 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index edf4a63c6d..8a51732276 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Wed Sep 3 13:23:29 2014 Tanaka Akira <akr@fsij.org>
+
+ * io.c (rb_io_autoclose_p): Don't raise on frozen IO.
+
+ * test/lib/minitest/unit.rb: IO#autoclose? may raise IOError.
+
+Wed Sep 3 13:23:29 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_fileno, rb_io_inspect): non-modification does not
+ error on frozen IO. [ruby-dev:48241] [Bug #9865]
+
Wed Sep 3 13:17:38 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* configure.in (posix_fadvise): disable use of posix_fadvise
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;
}
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index 17cfd28bf8..f4b65f7f36 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -1003,6 +1003,8 @@ class TestIO < Test::Unit::TestCase
assert_raise(SecurityError) do
safe_4 { r.inspect }
end
+ r.freeze
+ assert_match(/^#<IO:fd \d+>$/, r.inspect)
end
end
@@ -2556,6 +2558,21 @@ End
assert_equal(2, $stderr.fileno)
end
+ def test_frozen_fileno
+ bug9865 = '[ruby-dev:48241] [Bug #9865]'
+ with_pipe do |r,w|
+ fd = r.fileno
+ assert_equal(fd, r.freeze.fileno, bug9865)
+ end
+ end
+
+ def test_frozen_autoclose
+ with_pipe do |r,w|
+ fd = r.fileno
+ assert_equal(true, r.freeze.autoclose?)
+ end
+ end
+
def test_sysread_locktmp
bug6099 = '[ruby-dev:45297]'
buf = " " * 100
diff --git a/version.h b/version.h
index f138795a86..2d10400787 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.0.0"
#define RUBY_RELEASE_DATE "2014-09-03"
-#define RUBY_PATCHLEVEL 546
+#define RUBY_PATCHLEVEL 547
#define RUBY_RELEASE_YEAR 2014
#define RUBY_RELEASE_MONTH 9