summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-12 16:00:03 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-01-12 16:00:03 +0000
commit07594eed503cf71bd270b8ea5532692326d09679 (patch)
tree3cc52a2520199724d702ee18bc73e1126b264ea9
parentcb190ce643dfcce63077623aa8e43547858fe2c3 (diff)
* ext/socket/socket.c (sock_s_unpack_sockaddr_in): check too short
sockaddr. (sock_s_unpack_sockaddr_un): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@21469 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--ext/socket/socket.c10
-rw-r--r--test/socket/test_socket.rb2
3 files changed, 18 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 63cc5ea6d1..47040b9e6c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Jan 13 00:57:56 2009 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (sock_s_unpack_sockaddr_in): check too short
+ sockaddr.
+ (sock_s_unpack_sockaddr_un): ditto.
+
Mon Jan 12 16:45:28 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* win32/win32.c (open_dir_handle): extracted from rb_w32_opendir.
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 9385ad714e..1ff5cda8f6 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -3802,6 +3802,11 @@ sock_s_unpack_sockaddr_in(self, addr)
VALUE host;
sockaddr = (struct sockaddr_in*)StringValuePtr(addr);
+ if (RSTRING_LEN(addr) <
+ (char*)&((struct sockaddr *)sockaddr)->sa_family +
+ sizeof(((struct sockaddr *)sockaddr)->sa_family) -
+ (char*)sockaddr)
+ rb_raise(rb_eArgError, "too short sockaddr");
if (((struct sockaddr *)sockaddr)->sa_family != AF_INET
#ifdef INET6
&& ((struct sockaddr *)sockaddr)->sa_family != AF_INET6
@@ -3850,6 +3855,11 @@ sock_s_unpack_sockaddr_un(self, addr)
VALUE path;
sockaddr = (struct sockaddr_un*)StringValuePtr(addr);
+ if (RSTRING_LEN(addr) <
+ (char*)&((struct sockaddr *)sockaddr)->sa_family +
+ sizeof(((struct sockaddr *)sockaddr)->sa_family) -
+ (char*)sockaddr)
+ rb_raise(rb_eArgError, "too short sockaddr");
if (((struct sockaddr *)sockaddr)->sa_family != AF_UNIX) {
rb_raise(rb_eArgError, "not an AF_UNIX sockaddr");
}
diff --git a/test/socket/test_socket.rb b/test/socket/test_socket.rb
index fc01467f16..c5428b0b58 100644
--- a/test/socket/test_socket.rb
+++ b/test/socket/test_socket.rb
@@ -79,5 +79,7 @@ class TestSocket < Test::Unit::TestCase
assert_raise(ArgumentError) { Socket.unpack_sockaddr_un(sockaddr_in) }
sockaddr_un = Socket.sockaddr_un("/tmp/s")
assert_raise(ArgumentError) { Socket.unpack_sockaddr_in(sockaddr_un) }
+ assert_raise(ArgumentError) { Socket.unpack_sockaddr_in("") }
+ assert_raise(ArgumentError) { Socket.unpack_sockaddr_un("") }
end
end if defined?(Socket) && Socket.respond_to?(:sockaddr_un)