[#39464] Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

25 messages 2004/04/01
[#39608] Re: Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — pegacorn@... 2004/05/02

遅い反応&File.fnmatchは使った事ない&ruby-devの方では

[#39609] Re: Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — pegacorn@... 2004/05/02

File.fnmatch(と Dir.glob)をちょっと使ってみたのですが、

[#39610] Re: Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/05/02

山本です。

[#39611] Re: Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — matz@... (Yukihiro Matsumoto) 2004/05/02

まつもと ゆきひろです

[#39613] Re: Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — pegacorn@... 2004/05/02

From: matz@ruby-lang.org (Yukihiro Matsumoto)

[#39616] Re: Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — matz@... (Yukihiro Matsumoto) 2004/05/02

まつもと ゆきひろです

[#39620] Re: Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — pegacorn@... 2004/05/03

From: matz@ruby-lang.org (Yukihiro Matsumoto)

[#39621] Re: Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — matz@... (Yukihiro Matsumoto) 2004/05/03

まつもと ゆきひろです

[#39622] Re: Re [ruby-dev:23297] 大文字・小文字の区別がDOSISHかどうかで変わる、パス名マッチ関数の提案 — pegacorn@... 2004/05/03

From: matz@ruby-lang.org (Yukihiro Matsumoto)

[ruby-list:39468] Re: gethostbynameでホスト名が引けない

From: 堀川 久 <vzw00011@...>
Date: 2004-04-01 12:41:27 UTC
List: ruby-list #39468
こんにちは。

Yukihiro Matsumoto wrote on the <1080777873.492134.22819.nullmailer@picachu.netlab.jp>
>|Rubyのバージョンは、ruby 1.8.1 (2004-03-08) です。
>|よろしくお願いします。
>
>おかしいなあ。[ruby-dev:39452]にも書いたように再現しません。
>このバグは

ごめんなさい。[ruby-list:39450] でのエラーメッセージはRuby 1.6で動かし
たときのものでした。

とはいうものの、Ruby 1.8でもやはりエラーになるので、調べました。

添付のパッチで直りました。gethostbyname()にNULLを渡したときにエラーに
なっていました。また、addrinfoの解放漏れもあったので、その修正もしてい
ます。

よろしくお願いします。

-- 
HORIKAWA Hisashi (in Kanji: 堀川 久)
Netsphere Laboratories  http://www.nslabs.jp/

Attachments (1)

socket-q2.diff (4.19 KB, text/x-diff)
*** ../../../ruby-1.8.1-20040308.orig/ext/socket/socket.c	2004-01-27 11:09:34.000000000 +0900
--- socket.c	2004-04-01 21:31:29.947830152 +0900
***************
*** 625,631 ****
      VALUE host, port;
      int socktype, flags;
  {
!     struct addrinfo hints, *hintsp, *res;
      char *hostp, *portp;
      int error;
      char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
--- 625,632 ----
      VALUE host, port;
      int socktype, flags;
  {
!     struct addrinfo hints;
!     struct addrinfo* res = NULL;
      char *hostp, *portp;
      int error;
      char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
***************
*** 637,649 ****
         socktype = SOCK_DGRAM;
      }
  
-     hintsp = &hints;
      MEMZERO(&hints, struct addrinfo, 1);
!     hints.ai_family = PF_UNSPEC;
!     hints.ai_protocol = 0;
      hints.ai_socktype = socktype;
      hints.ai_flags = flags;
!     error = getaddrinfo(hostp, portp, hintsp, &res);
      if (error) {
  	if (hostp && hostp[strlen(hostp)-1] == '\n') {
  	    rb_raise(rb_eSocket, "newline at the end of hostname");
--- 638,648 ----
         socktype = SOCK_DGRAM;
      }
  
      MEMZERO(&hints, struct addrinfo, 1);
!     hints.ai_family = AF_UNSPEC;
      hints.ai_socktype = socktype;
      hints.ai_flags = flags;
!     error = getaddrinfo(hostp, portp, &hints, &res);
      if (error) {
  	if (hostp && hostp[strlen(hostp)-1] == '\n') {
  	    rb_raise(rb_eSocket, "newline at the end of hostname");
***************
*** 1027,1064 ****
  #endif
  
  static VALUE
! make_hostent(addr, ipaddr)
!     struct addrinfo *addr;
!     VALUE (*ipaddr) _((struct sockaddr*, size_t));
  {
      struct addrinfo *ai;
      struct hostent *h;
      VALUE ary, names;
      char **pch;
  
      ary = rb_ary_new();
!     rb_ary_push(ary, rb_str_new2(addr->ai_canonname));
! #if defined(HAVE_GETIPNODEBYNAME)
!     {
! 	int error;
  
! 	h = getipnodebyname(addr->ai_canonname, addr->ai_family, AI_ALL, &error);
!     }
! #elif defined(HAVE_GETHOSTBYNAME2)
!     h = gethostbyname2(addr->ai_canonname, addr->ai_family);
! #else
!     h = gethostbyname(addr->ai_canonname);
! #endif
!     if (h) {
  	names = rb_ary_new();
  	if (h->h_aliases != NULL) {
  	    for (pch = h->h_aliases; *pch; pch++) {
  		rb_ary_push(names, rb_str_new2(*pch));
  	    }
  	}
- #if defined(HAVE_GETIPNODEBYNAME)
- 	freehostent(h);
- #endif
      }
      else {
  	names = rb_ary_new2(0);
--- 1026,1055 ----
  #endif
  
  static VALUE
! make_hostent(
!     VALUE host,
!     struct addrinfo* addr,
!     VALUE (*ipaddr)(struct sockaddr*, size_t))
  {
      struct addrinfo *ai;
      struct hostent *h;
      VALUE ary, names;
      char **pch;
+     const char* hostp;
+     char hbuf[NI_MAXHOST];
+ 
+     hostp = host_str(host, hbuf, sizeof(hbuf));
  
      ary = rb_ary_new();
!     rb_ary_push(ary, rb_str_new2(addr->ai_canonname ? addr->ai_canonname : hostp));
  
!     if (addr->ai_canonname && (h = gethostbyname(addr->ai_canonname))) {
  	names = rb_ary_new();
  	if (h->h_aliases != NULL) {
  	    for (pch = h->h_aliases; *pch; pch++) {
  		rb_ary_push(names, rb_str_new2(*pch));
  	    }
  	}
      }
      else {
  	names = rb_ary_new2(0);
***************
*** 1084,1091 ****
  tcp_s_gethostbyname(obj, host)
      VALUE obj, host;
  {
      rb_secure(3);
!     return make_hostent(sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME), tcp_sockaddr);
  }
  
  static VALUE
--- 1075,1089 ----
  tcp_s_gethostbyname(obj, host)
      VALUE obj, host;
  {
+     struct addrinfo* addr;
+     VALUE r;
+ 
      rb_secure(3);
!     addr = sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME);
!     r = make_hostent(host, addr, tcp_sockaddr);
!     freeaddrinfo(addr);
! 
!     return r;
  }
  
  static VALUE
***************
*** 1995,2002 ****
  sock_s_gethostbyname(obj, host)
      VALUE obj, host;
  {
      rb_secure(3);
!     return make_hostent(sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME), sock_sockaddr);
  }
  
  static VALUE
--- 1993,2007 ----
  sock_s_gethostbyname(obj, host)
      VALUE obj, host;
  {
+     struct addrinfo* addr;
+     VALUE r;
+     
      rb_secure(3);
!     addr = sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME);
!     r = make_hostent(host, addr, sock_sockaddr);
!     freeaddrinfo(addr);
! 
!     return r;
  }
  
  static VALUE

In This Thread