summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ext/socket/init.c15
-rw-r--r--test/socket/test_basicsocket.rb11
-rw-r--r--version.h2
4 files changed, 27 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 8b274e569a..849d0938e0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Feb 25 17:38:59 2016 Eric Wong <e@80x24.org>
+
+ * 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]
+
Thu Feb 25 17:33:38 2016 SHIBATA Hiroshi <hsbt@ruby-lang.org>
* cont.c: fix a double word typo.
diff --git a/ext/socket/init.c b/ext/socket/init.c
index d3b875c78d..ada81c5306 100644
--- a/ext/socket/init.c
+++ b/ext/socket/init.c
@@ -48,15 +48,18 @@ rsock_init_sock(VALUE sock, int fd)
if (fstat(fd, &sbuf) < 0)
rb_sys_fail("fstat(2)");
- rb_update_max_fd(fd);
- if (!S_ISSOCK(sbuf.st_mode))
- rb_raise(rb_eArgError, "not a socket file descriptor");
+ if (!S_ISSOCK(sbuf.st_mode)) {
+ errno = EBADF;
+ rb_sys_fail("not a socket file descriptor");
+ }
#else
- rb_update_max_fd(fd);
- if (!rb_w32_is_socket(fd))
- rb_raise(rb_eArgError, "not a socket file descriptor");
+ if (!rb_w32_is_socket(fd)) {
+ errno = EBADF;
+ rb_sys_fail("not a socket file descriptor");
+ }
#endif
+ 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 59b739e813..218576a2b6 100644
--- a/test/socket/test_basicsocket.rb
+++ b/test/socket/test_basicsocket.rb
@@ -85,4 +85,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)
diff --git a/version.h b/version.h
index 35aea000c7..a72a559f49 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.1.9"
#define RUBY_RELEASE_DATE "2016-02-25"
-#define RUBY_PATCHLEVEL 444
+#define RUBY_PATCHLEVEL 445
#define RUBY_RELEASE_YEAR 2016
#define RUBY_RELEASE_MONTH 2