aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Oliver Nutter <headius@headius.com>2023-10-20 23:30:40 -0500
committerGitHub <noreply@github.com>2023-10-21 17:30:40 +1300
commit55d954721e25ada90482f6d3f751a12fc982620b (patch)
tree09582e517deafb57dc2479ad99245f45c63f6d27
parent0e62802c3bdc2167b1c8e5f9db014f1e421f2c62 (diff)
downloadruby-55d954721e25ada90482f6d3f751a12fc982620b.tar.gz
Raise TypeError for bad IO::Buffer.map argument (#8728)
* Raise TypeError when IO::Buffer.map argument is neither IO nor implements #fileno * Use UNREACHABLE_CODE Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org> * Use macro for undef check Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org> --------- Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
-rw-r--r--io.c9
-rw-r--r--test/ruby/test_io_buffer.rb2
2 files changed, 9 insertions, 2 deletions
diff --git a/io.c b/io.c
index f4698a2cd5..28b5abb1c5 100644
--- a/io.c
+++ b/io.c
@@ -2870,8 +2870,15 @@ rb_io_descriptor(VALUE io)
return fptr->fd;
}
else {
- return RB_NUM2INT(rb_funcall(io, id_fileno, 0));
+ VALUE fileno = rb_check_funcall(io, id_fileno, 0, NULL);
+ if (!UNDEF_P(fileno)) {
+ return RB_NUM2INT(fileno);
+ }
}
+
+ rb_raise(rb_eTypeError, "expected IO or #fileno, %"PRIsVALUE" given", rb_obj_class(io));
+
+ UNREACHABLE_RETURN(-1);
}
int
diff --git a/test/ruby/test_io_buffer.rb b/test/ruby/test_io_buffer.rb
index 1b4a09dd20..dea8388d7d 100644
--- a/test/ruby/test_io_buffer.rb
+++ b/test/ruby/test_io_buffer.rb
@@ -80,7 +80,7 @@ class TestIOBuffer < Test::Unit::TestCase
end
def test_file_mapped_invalid
- assert_raise NoMethodError do
+ assert_raise TypeError do
IO::Buffer.map("foobar")
end
end