From 409e53dec17a725dfa9963ad7d907185bbb208fb Mon Sep 17 00:00:00 2001 From: normal Date: Mon, 21 Dec 2015 18:57:50 +0000 Subject: avoid rb_bug on BasicSocket.for_fd(-1) * ext/socket/init.c (rsock_init_sock): check FD after validating * test/socket/test_basicsocket.rb (test_for_fd): new [ruby-core:72418] [Bug #11854] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53231 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ ext/socket/init.c | 2 +- test/socket/test_basicsocket.rb | 11 +++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 06f696e6c5..b63b8d6c46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Tue Dec 22 03:57:20 2015 Eric Wong + + * ext/socket/init.c (rsock_init_sock): check FD after validating + * test/socket/test_basicsocket.rb (test_for_fd): new + [ruby-core:72418] [Bug #11854] + Mon Dec 21 21:29:45 2015 Naohisa Goto * variable.c (struct ivar_update): rename "extended" to "iv_extended" diff --git a/ext/socket/init.c b/ext/socket/init.c index d0711025a5..bd069263c6 100644 --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -61,10 +61,10 @@ rsock_init_sock(VALUE sock, int fd) { rb_io_t *fp; - rb_update_max_fd(fd); if (!is_socket(fd)) rb_raise(rb_eArgError, "not a socket file descriptor"); + rb_update_max_fd(fd); MakeOpenFile(sock, fp); fp->fd = fd; fp->mode = FMODE_READWRITE|FMODE_DUPLEX; diff --git a/test/socket/test_basicsocket.rb b/test/socket/test_basicsocket.rb index 227034ed26..52732f18f6 100644 --- a/test/socket/test_basicsocket.rb +++ b/test/socket/test_basicsocket.rb @@ -133,4 +133,15 @@ class TestSocket_BasicSocket < Test::Unit::TestCase end end + def test_for_fd + assert_raise(Errno::EBADF, '[ruby-core:72418] [Bug #11854]') do + BasicSocket.for_fd(-1) + end + inet_stream do |sock| + s = BasicSocket.for_fd(sock.fileno) + assert_instance_of BasicSocket, s + s.autoclose = false + sock.close + end + end end if defined?(BasicSocket) -- cgit v1.2.3