>>>>> "W" == WATANABE Hirofumi <watanabe / ase.ptg.sony.co.jp> writes:
WATANABE Tetsuya <tetsu / jpn.hp.com> writes:

:ext/socket.c で strtoul(3) を使っているんですが、ちょっと仕様と
:実際の動作が違うようです。仕様だと変換できないような文字では 
:ULONG_MAX を返すはずですが、実際には 0 が帰ってきます。

W> ULONG_MAX を返すのはオーバーフローしたときだけです.
W> だからもともと strtoul だけでは判断できません.

あ、すいません。これは間違いですね。

今回の場合 /etc/services にエントリがない場合に
どのようになるか? と思って確認していて core を
はいたのでした。

irb(main):001:0> require "socket"
true
irb(main):003:0> p Socket.getservbyname('ddddd', 'udp')
SocketError: service/proto not found
(irb):3:in `getservbyname'
(irb):3
(irb_local_binding):1:in `eval'
irb(main):004:0> udp = UDPsocket.open
#<UDPsocket:0x40081cd0>
irb(main):005:0> udp.connect('localhost', 'ddddd')
(irb):5: [BUG] Bus Error

サービス名として登録されているか? という確認は
可能なのですが(上記 getservbyname)、socket.c で
の対応としてサービスポートナンバーが「0」という
のはないと思われるので、「0」の場合はエラー処理
に回す? (数値としての 0 が指定されていれば、別
の処理が行われます) のでよさそうな気がします。

W> "ruby" のような文字列を与えた場合は 0 が返るのは昔からそう
W> だったから仕様と言えば仕様でしょうね.

W> 初期値 0 で変換できない文字にぶちあたったら break するような
W> 処理だと思うので, たとえば "12ruby" なら 12 になります.

これはわかります。

W> やるんなら自前でチェックしないとやっぱだめでしょうね.

そうですか。できれば楽したいですね。

文字列であって /etc/services にない場合に "no
such service %s" を表示する意図にみえたので、前
回のパッチのようにしたんです。

--
WATANABE Tetsuya HP Japan
e-mail  tetsu / jpn.hp.com