[#14922] alias $gvar — Koji Arai <JCA02266@...>

新井です。

19 messages 2001/10/14

[#15006] Re: eval.c (rb_stack_check): prohibit recursive raising error — WATANABE Hirofumi <eban@...>

わたなべです。

13 messages 2001/10/26
[#15008] Re: eval.c (rb_stack_check): prohibit recursive raising error — Shugo Maeda <shugo@...> 2001/10/26

前田です。

[ruby-dev:14998] TCPSocket.gethostbyname で Segmentation fault

From: tomohiko machida <machida@...>
Date: 2001-10-25 06:17:01 UTC
List: ruby-dev #14998
はじめまして。
町田といいます。
過去ログの検索でそれらしい話題がみつからなかったので書いてい
ます。

主にcygwin版のRubyを使っているのですが、Segmentation fault 
が起きるのでちょっと調べてみたところ、socket.c の
tcp_s_gethostbyname の #ifdef h_addr からの処理で落ちている
ことがわかりました。

どうやら pch がさしている h->h_addr_list の内容をループ中で
呼んでいる gethostbyaddr が破壊しているようです。

Manpage of GETHOSTBYNAME には
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/gethostbyaddr.3.html
------
gethostbyname() および gethostbyaddr() 関数は静的データへの
ポインタを返す。このポインタは、その後の呼び出しで上書きされ
るかもしれない。 hostent 構造体はポインタを含んでいるので、
構造体のコピーだけでは不十分である。 - より深いコピーが必要
である。 
------
とありますが、どうなんでしょう?

ひとまず以下のような修正でうまく動いているようです。(たぶん)

    {
    int addr_list_size;
    for (pch = h->h_addr_list; *pch; pch++);
    pch++;
    addr_list_size = (int)pch - (int)h->h_addr_list;
    pch = (char **)alloca(addr_list_size);
    memcpy((char *)pch, (char *)h->h_addr_list, addr_list_size);
    for (; *pch; pch++) {
    ...
    }
    }

わたしが参照したソースは10月24日にダウンロードした
stable-snapshot.tar.gz ですが、たぶん他も同じですよね。

-------------------------------
Tomohiko Machida
machida@mica.semicon.sony.co.jp

In This Thread

Prev Next