From: WATANABE Tetsuya Date: 1998-06-01T23:00:04+09:00 Subject: [ruby-dev:2796] ext/socket.c わたなべてつやです。 socket を使っていて、エラーの確認をしていたのですが、サービス名 を間違って渡した場合 core をはいてしまいました。 # どこまで手を抜いて書けるか確認していたんです。 ext/socket.c で strtoul(3) を使っているんですが、ちょっと仕様と 実際の動作が違うようです。仕様だと変換できないような文字では ULONG_MAX を返すはずですが、実際には 0 が帰ってきます。このため、 文字列で実際のサービスが登録されていない場合の処理がうまく行っ ていません。エラーとして扱わず、サービス(ポート)を 0 として処理 してしまいます。これは本当はどうしたらいいんでしょうね? -1 と 0 の両方を確認した方がいいのかな? それと udp_addrsetup(host, port, addr) 中で port という変数名を 使い回していて、エラーメッセージを表示する際にうまく動作しませ んでした。こちらはちょっと気が付きにくかったです。 この動作確認は Linux libc.so.5.4.38 と HP-UX 10.20 で確認しまし た。 ------------------------------ $ diff -u socket.c.org socket.c --- socket.c.org Mon May 18 18:12:27 1998 +++ socket.c Mon Jun 1 22:43:00 1998 @@ -495,7 +495,7 @@ servent = getservbyname(RSTRING(serv)->ptr, "tcp"); if (servent == NULL) { servport = strtoul(RSTRING(serv)->ptr, 0, 0); - if (servport == -1) { + if (servport == 0) { Raise(eSocket, "no such servce %s", RSTRING(serv)->ptr); } setup_servent: @@ -860,12 +860,12 @@ addr->sin_port = servent->s_port; } else { - int port = strtoul(RSTRING(port)->ptr, 0, 0); + int port_ = strtoul(RSTRING(port)->ptr, 0, 0); - if (port == -1) { + if (port_ == 0) { Raise(eSocket, "no such servce %s", RSTRING(port)->ptr); } - addr->sin_port = htons(port); + addr->sin_port = htons(port_); } } } ------------------------------ -- WATANABE Tetsuya HP Japan e-mail tetsu@jpn.hp.com