diff options
| author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-12 16:00:03 +0000 |
|---|---|---|
| committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-01-12 16:00:03 +0000 |
| commit | 07594eed503cf71bd270b8ea5532692326d09679 (patch) | |
| tree | 3cc52a2520199724d702ee18bc73e1126b264ea9 | |
| parent | cb190ce643dfcce63077623aa8e43547858fe2c3 (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-- | ChangeLog | 6 | ||||
| -rw-r--r-- | ext/socket/socket.c | 10 | ||||
| -rw-r--r-- | test/socket/test_socket.rb | 2 |
3 files changed, 18 insertions, 0 deletions
@@ -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) |
