[#28677] `Socket#unpack_sockaddr_un': sockaddr_un size differs - 15 required; 110 given (TypeError) — Tanaka Akira <akr@...17n.org>
ふと気がついたのですが、Socket.unpack_sockaddr_un に
[#28681] ブロックパラメータと多値について — Takaaki Tateishi <ttate@...>
まつもと ゆきひろです
[#28689] digest.rb — Tanaka Akira <akr@...17n.org>
require 'digest/sha2' の sha2 がどうも余計に思えるので、
久しぶりに復帰。
In article <863bav6a0w.knu@iDaemons.org>,
[#28694] test/socket for Windows — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#28700] irb/init.rb code suggestion to find user's home directory in windows — keiju@... (Keiju ISHITSUKA)
けいじゅ@いしつかです.
[#28708] 1.8.5 release schedule? — URABE Shyouhei <root@...>
というわけで今日の基調講演で8月に1.8.5が出ることになったわけですが。
まつもと ゆきひろです
卜部です。
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
とみたです。
とみたです。
卜部です。
柳田です。
In article <y7vnup05.wl%yanagi@shakenbu.org>,
> いちおう問題の切り分けをするために確認したいんですが、その環
In article <veqrun77.wl%yanagi@shakenbu.org>,
mswin32 版ではどうなるのだろうと思って
Cygwin @ WindowsXP SP2 です。
In article <449D66EC.8050405@cyanet.jp>,
send の第一引数が mesg なので変わって当然でした orz
Cで書いたプログラムで127.0.0.1に向かって空データを送ったところ無事届きま
ruby が 0.0.0.0 で待ち受けて、C言語プログラムで 127.0.0.1 に空パケットを
下記の通り Winsock2 を使わずにC言語でプログラムを書いて、空パケットを投
In article <449D921F.8080109@cyanet.jp>,
永井@知能.九工大です.
永井@知能.九工大です.
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
卜部です。
こんにちは、なかむら(う)です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
In article <1155082949.798513.13047.nullmailer@x31.priv.netlab.jp>,
[#28715] several problems on the big commit — Tanaka Akira <akr@...17n.org>
件の大きなコミットをざっと眺めてみたのですが、
[#28718] binding の仕様変更? or バグ? — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
まつもと ゆきひろです
[#28720] IO.readとバイナリモード — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#28729] backport Process.getrlimit and Process.setrlimit to 1.8 — Tanaka Akira <akr@...17n.org>
何回か (chkbuild で CPU 時間を制限するとか、cgi で CPU 時間
まつもと ゆきひろです
大原です。
[#28741] not ok iterator 80 -- ./sample/test.rb:1104 — Tanaka Akira <akr@...17n.org>
sample/test.rb が 2つ失敗していますが、最初の失敗は次のものです。
[#28744] rational 1.08 — Tadayoshi Funaba <tadf@...>
ふなばです。
原です。
ふなばです。
まつもと ゆきひろです
まつもと ゆきひろです
原です。
[#28747] lack in pp — Tadashi Saito <shiba@...2.accsnet.ne.jp>
こんにちは。斎藤と申します。
[#28770] signal & native-thread — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
[#28778] GC problem (?) in 1.8 — URABE Shyouhei <root@...>
卜部です。
In article <449851E1.9030302@mput.dip.jp>,
[#28786] "abc"[3] returns "" — Tanaka Akira <akr@...17n.org>
test-all が
[#28805] `DRb::DRbMessage#recv_request': uninitialized constant DRb::DRbMessage::Values (NameError) — Tanaka Akira <akr@...17n.org>
[ruby-dev:28802] のパッチがあたると、次はこうです。
[#28812] test_return_trace_func(TestIterator): /tmp/19/lib/ruby/1.9/test/unit.rb:275: ArgumentError — Tanaka Akira <akr@...17n.org>
で、次は
[#28822] when *a — Minero Aoki <aamine@...>
青木です。
[#28840] SEGV by block.call — Tanaka Akira <akr@...17n.org>
どうも boron での SEGV が直らないので、
[#28875] rb_define_methods — SASADA Koichi <ko1@...>
ささだです。
卜部です。
まつもと ゆきひろです
[ruby-dev:28683] Re: `Socket#unpack_sockaddr_un': sockaddr_un size differs - 15 required; 110 given (TypeError)
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]