わたなべてつやです。

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