[#28681] ブロックパラメータと多値について — Takaaki Tateishi <ttate@...>

11 messages 2006/06/02

[#28708] 1.8.5 release schedule? — URABE Shyouhei <root@...>

というわけで今日の基調講演で8月に1.8.5が出ることになったわけですが。

105 messages 2006/06/10
[#28709] Re: 1.8.5 release schedule? — Yukihiro Matsumoto <matz@...> 2006/06/10

まつもと ゆきひろです

[#28711] Re: 1.8.5 release schedule? — URABE Shyouhei <root@...> 2006/06/11

卜部です。

[#28751] Re: 1.8.5 release schedule? — URABE Shyouhei <root@...> 2006/06/19

卜部です。

[#28752] Re: 1.8.5 release schedule? — Yukihiro Matsumoto <matz@...> 2006/06/19

まつもと ゆきひろです

[#28753] Re: 1.8.5 release schedule? — URABE Shyouhei <root@...> 2006/06/19

卜部です。

[#28754] Re: 1.8.5 release schedule? — Yukihiro Matsumoto <matz@...> 2006/06/19

まつもと ゆきひろです

[#28813] Re: 1.8.5 release schedule? — URABE Shyouhei <root@...> 2006/06/23

卜部です。

[#28818] ruby 1.8.5 preview1 (Re: Re: 1.8.5 release schedule?) — Yukihiro Matsumoto <matz@...> 2006/06/24

まつもと ゆきひろです

[#28819] Re: ruby 1.8.5 preview1 (Re: Re: 1.8.5 release schedule?) — URABE Shyouhei <root@...> 2006/06/24

卜部です。

[#28820] Re: ruby 1.8.5 preview1 (Re: Re: 1.8.5 release schedule?) — Kouhei Yanagita <yanagi@...> 2006/06/24

柳田です。

[#28821] udp test with ruby 1.8.5 preview1 on cygwin — Tanaka Akira <akr@...17n.org> 2006/06/24

In article <y7vnup05.wl%yanagi@shakenbu.org>,

[#28823] Re: udp test with ruby 1.8.5 preview1 on cygwin — Kouhei Yanagita <yanagi@...> 2006/06/24

> いちおう問題の切り分けをするために確認したいんですが、その環

[#28824] Re: udp test with ruby 1.8.5 preview1 on cygwin — Tanaka Akira <akr@...17n.org> 2006/06/24

In article <veqrun77.wl%yanagi@shakenbu.org>,

[#28825] Re: udp test with ruby 1.8.5 preview1 on cygwin — Kouhei Yanagita <yanagi@...> 2006/06/24

mswin32 版ではどうなるのだろうと思って

[#28833] Re: udp test with ruby 1.8.5 preview1 on cygwin — info@... 2006/06/24

Cygwin @ WindowsXP SP2 です。

[#28834] Re: udp test with ruby 1.8.5 preview1 on cygwin — Tanaka Akira <akr@...17n.org> 2006/06/24

In article <449D66EC.8050405@cyanet.jp>,

[#29120] Re: 1.8.5 release schedule? — "U.Nakamura" <usa@...> 2006/07/24

こんにちは、なかむら(う)です。

[#29121] Re: 1.8.5 release schedule? — Yukihiro Matsumoto <matz@...> 2006/07/24

まつもと ゆきひろです

[#29128] bugs in ruby_1_8 (Re: 1.8.5 release schedule?) — URABE Shyouhei <root@...> 2006/07/25

卜部です。

[#29133] Re: bugs in ruby_1_8 (Re: 1.8.5 release schedule?) — Yukihiro Matsumoto <matz@...> 2006/07/26

まつもと ゆきひろです

[#29144] Re: bugs in ruby_1_8 (Re: 1.8.5 release schedule?) — URABE Shyouhei <root@...> 2006/07/26

卜部です。

[#29146] Re: bugs in ruby_1_8 (Re: 1.8.5 release schedule?) — Yukihiro Matsumoto <matz@...> 2006/07/26

まつもと ゆきひろです

[#29185] 1.8.5 preview3? — URABE Shyouhei <root@...> 2006/08/04

卜部です。

[#29186] Re: 1.8.5 preview3? — Yukihiro Matsumoto <matz@...> 2006/08/04

まつもと ゆきひろです

[#29225] Re: 1.8.5 preview3? — URABE Shyouhei <root@...> 2006/08/08

卜部です。

[#29226] Re: 1.8.5 preview3? — Yukihiro Matsumoto <matz@...> 2006/08/08

まつもと ゆきひろです

[#29228] Re: 1.8.5 preview3? — Yukihiro Matsumoto <matz@...> 2006/08/08

まつもと ゆきひろです

[#29231] Re: 1.8.5 preview3? — URABE Shyouhei <root@...> 2006/08/08

卜部です。

[#28718] binding の仕様変更? or バグ? — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

15 messages 2006/06/12

[#28744] rational 1.08 — Tadayoshi Funaba <tadf@...>

ふなばです。

27 messages 2006/06/18
[#28773] Re: rational 1.08 — Shin-ichiro HARA <sinara@...> 2006/06/20

原です。

[#28830] Re: rational 1.08 — Tadayoshi Funaba <tadf@...> 2006/06/24

ふなばです。

[ruby-dev:28683] Re: `Socket#unpack_sockaddr_un': sockaddr_un size differs - 15 required; 110 given (TypeError)

From: Tanaka Akira <akr@...17n.org>
Date: 2006-06-03 04:49:29 UTC
List: ruby-dev #28683
In article <87k680kcc2.fsf@m17n.org>,
  Tanaka Akira <akr@m17n.org> writes:

> ふと気がついたのですが、Socket.unpack_sockaddr_un に
> UNIXServer#getsockname で得たアドレスを渡すとエラーになりま
> す。
>
> % ./ruby -v -rsocket -e '
> File.unlink("/tmp/tmpsock") rescue nil
> s = UNIXServer.new("/tmp/tmpsock")
> p s.getsockname
> p Socket.unpack_sockaddr_un(s.getsockname)'
> ruby 1.9.0 (2006-06-01) [i686-linux]
> "\001\000/tmp/tmpsock\000"
> -e:5:in `Socket#unpack_sockaddr_un': sockaddr_un size differs - 15 required; 110 given (TypeError)
>         from -e:5
>
> getsockname で得たものをうまく扱えないのは変じゃないでしょう
> か。

この他、無名の UNIX ソケットの addr, peeraddr, path が変だとか、

% ruby -v -rsocket -e '
s1, s2 = UNIXSocket.pair         
p s1.addr                         
p s1.peeraddr
p s1.path
'
ruby 1.9.0 (2006-06-02) [i686-linux]
["AF_UNIX", "\224\272\332\267\2408\356\267\241j\341\267HZ\364\267"]
["AF_UNIX", "\374 \332\267\034)\332\267\200v\024\010\034)\332\267\001"]
"\034)\332\267\200v\024\010\034)\332\267\001"

UNIXSocket#path が接続先のパスを返すとか、

% ruby -v -rsocket -e '
UNIXServer.open("/tmp/s") {|serv|
  p UNIXSocket.open("/tmp/s").path
}'
ruby 1.9.0 (2006-06-02) [i686-linux]
"/tmp/s"

UNIXServer.open で作ったはずのところにソケットがないとか、

% ruby -v -rsocket -e '                                                                                         
path = "/tmp/" + "s" * 120
UNIXServer.open(path) {|serv|
  p File.stat(path)
}'
ruby 1.9.0 (2006-06-02) [i686-linux]
-e:4:in `File#stat': No such file or directory - /tmp/ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss (Errno::ENOENT)
        from -e:4
        from -e:3

といった問題を直すにはこうですかね。

Index: ext/socket/socket.c
===================================================================
RCS file: /src/ruby/ext/socket/socket.c,v
retrieving revision 1.167
diff -u -p -r1.167 socket.c
--- ext/socket/socket.c	2 Jun 2006 12:06:09 -0000	1.167
+++ ext/socket/socket.c	3 Jun 2006 04:38:24 -0000
@@ -543,7 +543,7 @@ bsock_do_not_reverse_lookup_set(sock, st
 
 static VALUE ipaddr _((struct sockaddr*, int));
 #ifdef HAVE_SYS_UN_H
-static VALUE unixaddr _((struct sockaddr_un*));
+static VALUE unixaddr _((struct sockaddr_un*, socklen_t));
 #endif
 
 enum sock_recv_type {
@@ -620,10 +620,7 @@ s_recvfrom(sock, argc, argv, from)
 
 #ifdef HAVE_SYS_UN_H
       case RECV_UNIX:
-        if (alen) /* connection-oriented socket may not return a from result */
-            return rb_assoc_new(str, unixaddr((struct sockaddr_un*)buf));
-        else
-            return rb_assoc_new(str, Qnil);
+        return rb_assoc_new(str, unixaddr((struct sockaddr_un*)buf, alen));
 #endif
       case RECV_SOCKET:
 	return rb_assoc_new(str, rb_str_new(buf, alen));
@@ -685,8 +682,7 @@ s_recvfrom_nonblock(int argc, VALUE *arg
 
 #ifdef HAVE_SYS_UN_H
       case RECV_UNIX:
-        if (alen) /* connection-oriented socket may not return a from result */
-            addr = unixaddr((struct sockaddr_un*)buf);
+        addr = unixaddr((struct sockaddr_un*)buf, alen);
         break;
 #endif
 
@@ -1607,8 +1603,11 @@ init_unixsock(sock, path, server)
 
     MEMZERO(&sockaddr, struct sockaddr_un, 1);
     sockaddr.sun_family = AF_UNIX;
-    strncpy(sockaddr.sun_path, RSTRING(path)->ptr, sizeof(sockaddr.sun_path)-1);
-    sockaddr.sun_path[sizeof(sockaddr.sun_path)-1] = '\0';
+    if (sizeof(sockaddr.sun_path) <= RSTRING(path)->len) {
+        rb_raise(rb_eArgError, "too long unix socket path (max: %dbytes)",
+            (int)sizeof(sockaddr.sun_path)-1);
+    }
+    strcpy(sockaddr.sun_path, StringValueCStr(path));
 
     if (server) {
         status = bind(fd, (struct sockaddr*)&sockaddr, sizeof(sockaddr));
@@ -1634,7 +1633,9 @@ init_unixsock(sock, path, server)
 
     init_sock(sock, fd);
     GetOpenFile(sock, fptr);
-    fptr->path = strdup(RSTRING(path)->ptr);
+    if (server) {
+        fptr->path = strdup(RSTRING(path)->ptr);
+    }
 
     return sock;
 }
@@ -1866,6 +1867,15 @@ unix_init(sock, path)
     return init_unixsock(sock, path, 0);
 }
 
+static char *
+unixpath(struct sockaddr_un *sockaddr, socklen_t len)
+{
+    if (sockaddr->sun_path < (char*)sockaddr + len)
+        return sockaddr->sun_path;
+    else
+        return "";
+}
+
 static VALUE
 unix_path(sock)
     VALUE sock;
@@ -1878,7 +1888,7 @@ unix_path(sock)
 	socklen_t len = sizeof(addr);
 	if (getsockname(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
 	    rb_sys_fail(0);
-	fptr->path = strdup(addr.sun_path);
+	fptr->path = strdup(unixpath(&addr, len));
     }
     return rb_str_new2(fptr->path);
 }
@@ -2201,11 +2211,12 @@ unix_sysaccept(sock)
 
 #ifdef HAVE_SYS_UN_H
 static VALUE
-unixaddr(sockaddr)
+unixaddr(sockaddr, len)
     struct sockaddr_un *sockaddr;
+    socklen_t len;
 {
     return rb_assoc_new(rb_str_new2("AF_UNIX"),
-			rb_str_new2(sockaddr->sun_path));
+                        rb_str_new2(unixpath(sockaddr, len)));
 }
 #endif
 
@@ -2221,9 +2232,7 @@ unix_addr(sock)
 
     if (getsockname(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
 	rb_sys_fail("getsockname(2)");
-    if (len == 0)
-        addr.sun_path[0] = '\0';
-    return unixaddr(&addr);
+    return unixaddr(&addr, len);
 }
 
 static VALUE
@@ -2238,9 +2247,7 @@ unix_peeraddr(sock)
 
     if (getpeername(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
 	rb_sys_fail("getsockname(2)");
-    if (len == 0)
-        addr.sun_path[0] = '\0';
-    return unixaddr(&addr);
+    return unixaddr(&addr, len);
 }
 #endif
 
@@ -3516,11 +3523,17 @@ sock_s_pack_sockaddr_un(self, path)
     VALUE self, path;
 {
     struct sockaddr_un sockaddr;
+    char *sun_path;
     VALUE addr;
 
     MEMZERO(&sockaddr, struct sockaddr_un, 1);
     sockaddr.sun_family = AF_UNIX;
-    strncpy(sockaddr.sun_path, StringValuePtr(path), sizeof(sockaddr.sun_path)-1);
+    sun_path = StringValueCStr(path);
+    if (sizeof(sockaddr.sun_path) <= strlen(sun_path)) {
+        rb_raise(rb_eArgError, "too long unix socket path (max: %dbytes)",
+            (int)sizeof(sockaddr.sun_path)-1);
+    }
+    strncpy(sockaddr.sun_path, sun_path, sizeof(sockaddr.sun_path)-1);
     addr = rb_str_new((char*)&sockaddr, sizeof(sockaddr));
     OBJ_INFECT(addr, path);
 
@@ -3532,15 +3545,21 @@ sock_s_unpack_sockaddr_un(self, addr)
     VALUE self, addr;
 {
     struct sockaddr_un * sockaddr;
+    char *sun_path;
     VALUE path;
 
     sockaddr = (struct sockaddr_un*)StringValuePtr(addr);
-    if (RSTRING(addr)->len != sizeof(struct sockaddr_un)) {
-	rb_raise(rb_eTypeError, "sockaddr_un size differs - %ld required; %d given",
+    if (sizeof(struct sockaddr_un) < RSTRING(addr)->len) {
+	rb_raise(rb_eTypeError, "too long sockaddr_un - %ld longer than %d",
 		 RSTRING(addr)->len, sizeof(struct sockaddr_un));
     }
-    /* xxx: should I check against sun_path size? */
-    path = rb_str_new2(sockaddr->sun_path);
+    sun_path = unixpath(sockaddr, RSTRING(addr)->len);
+    if (sizeof(struct sockaddr_un) == RSTRING(addr)->len &&
+        sun_path == sockaddr->sun_path &&
+        sun_path + strlen(sun_path) == RSTRING(addr)->ptr + RSTRING(addr)->len) {
+        rb_raise(rb_eArgError, "sockaddr_un.sun_path not NUL terminated");
+    }
+    path = rb_str_new2(sun_path);
     OBJ_INFECT(path, addr);
     return path;
 }
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread