summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-30 12:47:55 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-30 12:47:55 +0000
commit4fe744b10706a62196957d1d9c45e1f63f9dfdd9 (patch)
tree9e5a28bafe4b6753714f0c3e94a06347c54916f3 /ext
parent7e0875aa161a6d83bf89d9a6a20f835fbb1c578f (diff)
merges r25336 and r25339 from trunk into ruby_1_9_1.
-- * ext/socket/init.c (rsock_init_sock): validate file descriptor. -- * ext/socket/init.c (rsock_init_sock): mswin doesn't have S_IFSOCK flag in st_mode of struct stat. so, use rb_w32_issocket() function instead of S_ISSOCK macro. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@26486 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/socket/socket.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 73a02d15f3..a7c5948b69 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -52,6 +52,9 @@
#ifdef HAVE_SYS_UN_H
#include <sys/un.h>
#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
#if defined(HAVE_FCNTL)
#ifdef HAVE_SYS_SELECT_H
@@ -237,6 +240,17 @@ static VALUE
init_sock(VALUE sock, int fd)
{
rb_io_t *fp;
+ struct stat sbuf;
+
+#ifndef _WIN32
+ if (fstat(fd, &sbuf) < 0)
+ rb_sys_fail(0);
+ if (!S_ISSOCK(sbuf.st_mode))
+ rb_raise(rb_eArgError, "not a socket file descriptor");
+#else
+ if (!rb_w32_is_socket(fd))
+ rb_raise(rb_eArgError, "not a socket file descriptor");
+#endif
MakeOpenFile(sock, fp);
fp->fd = fd;