From: tomohiko machida Date: 2001-10-25T15:17:01+09:00 Subject: [ruby-dev:14998] TCPSocket.gethostbyname で Segmentation fault はじめまして。 町田といいます。 過去ログの検索でそれらしい話題がみつからなかったので書いてい ます。 主に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