[前][次][番号順一覧][スレッド一覧]

ruby-changes:9930

From: akr <ko1@a...>
Date: Tue, 13 Jan 2009 01:00:32 +0900 (JST)
Subject: [ruby-changes:9930] Ruby:r21469 (trunk, ruby_1_8): * ext/socket/socket.c (sock_s_unpack_sockaddr_in): check too short

akr	2009-01-13 01:00:03 +0900 (Tue, 13 Jan 2009)

  New Revision: 21469

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21469

  Log:
    * ext/socket/socket.c (sock_s_unpack_sockaddr_in): check too short
      sockaddr.
      (sock_s_unpack_sockaddr_un): ditto.

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/ext/socket/socket.c
    branches/ruby_1_8/test/socket/test_socket.rb
    trunk/ChangeLog
    trunk/ext/socket/socket.c
    trunk/test/socket/test_socket.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 21468)
+++ ChangeLog	(revision 21469)
@@ -1,3 +1,9 @@
+Tue Jan 13 00:57:56 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/socket.c (sock_s_unpack_sockaddr_in): check too short
+	  sockaddr.
+	  (sock_s_unpack_sockaddr_un): ditto.
+
 Mon Jan 12 23:55:19 2009  Tanaka Akira  <akr@f...>
 
 	* ext/socket/socket.c (addrinfo_ip_unpack): new method
Index: ext/socket/socket.c
===================================================================
--- ext/socket/socket.c	(revision 21468)
+++ ext/socket/socket.c	(revision 21469)
@@ -4328,6 +4328,11 @@
     VALUE host;
 
     sockaddr = (struct sockaddr_in*)SockAddrStringValuePtr(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
@@ -4397,6 +4402,11 @@
     VALUE path;
 
     sockaddr = (struct sockaddr_un*)SockAddrStringValuePtr(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");
     }
Index: test/socket/test_socket.rb
===================================================================
--- test/socket/test_socket.rb	(revision 21468)
+++ test/socket/test_socket.rb	(revision 21469)
@@ -93,6 +93,8 @@
     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 if Socket.respond_to?(:sockaddr_un)
 
   def test_sysaccept
Index: ruby_1_8/ext/socket/socket.c
===================================================================
--- ruby_1_8/ext/socket/socket.c	(revision 21468)
+++ ruby_1_8/ext/socket/socket.c	(revision 21469)
@@ -3802,6 +3802,11 @@
     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 @@
     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");
     }
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 21468)
+++ ruby_1_8/ChangeLog	(revision 21469)
@@ -1,3 +1,9 @@
+Tue Jan 13 00:57:56 2009  Tanaka Akira  <akr@f...>
+
+	* 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@r...>
 
 	* win32/win32.c (open_dir_handle): extracted from rb_w32_opendir.
Index: ruby_1_8/test/socket/test_socket.rb
===================================================================
--- ruby_1_8/test/socket/test_socket.rb	(revision 21468)
+++ ruby_1_8/test/socket/test_socket.rb	(revision 21469)
@@ -79,5 +79,7 @@
     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)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]