[ping] [patch] getaddrinfo bug

Dan Nicolaescu dann at ics.uci.edu
Sat Feb 9 00:43:53 UTC 2008


Filippo ARCIDIACONO <filippo.arcidiacono at st.com> writes:

  >  
  > 
  > > -----Original Message-----
  > > From: uclibc-bounces at uclibc.org 
  > > [mailto:uclibc-bounces at uclibc.org] On Behalf Of Dan Nicolaescu
  > > Sent: Wednesday, January 30, 2008 8:54 PM
  > > To: uclibc at uclibc.org
  > > Subject: [ping] [patch] getaddrinfo bug
  > > 
  > > 2 weeks ago I sent this patch.  There was no feedback on it.
  > > 
  > > Can someone please take a look and comment on this patch? 
  > > 
  > > Thanks
  > >                 --dan
  > > 
  > > 
  > > 
  > > When using x11r7, starting X11 application ends up calling 
  > > _xcb_open_tcp in libxcb.
  > > 
  > > _xcb_open_tcp looks like this:
  > > 
  > > static int _xcb_open_tcp(char *host, const unsigned short port) {
  > >     int fd = -1;
  > >     struct addrinfo hints = { AI_ADDRCONFIG #ifdef AI_NUMERICSERV
  > >                               | AI_NUMERICSERV #endif
  > >                               , AF_UNSPEC, SOCK_STREAM }; [snip]
  > >       res = getaddrinfo(host, service, &hints, &results);
  > > 
  > > 
  > > uclibc's netdb.h always defines AI_NUMERICSERV, so 
  > > AI_NUMERICSERV is always used.
  > > 
  > > The getaddrinfo implementation in uclibc does:
  > > 
  > >     if (hints->ai_flags & ~(AI_PASSIVE|AI_CANONNAME|AI_NUMERICHOST|
  > >                             AI_ADDRCONFIG|AI_V4MAPPED|AI_ALL))
  > >         return EAI_BADFLAGS;
  > > 
  > > which means that getaddrinfo will always fail and return 
  > > EAI_BADFLAGS because it passes AI_NUMERICSERV.
  > > 
  > > As a result, X11 applications won't start.
  > > 
  > > This patch fixes the problem:
  > > 
  > > --- getaddrinfo.c.orig  2008-01-15 07:36:08.264317000 -0800
  > > +++ getaddrinfo.c       2008-01-15 07:36:00.518071000 -0800
  > > @@ -822,7 +822,7 @@
  > >      if (hints == NULL)
  > >         hints = &default_hints;
  > > 
  > > -    if (hints->ai_flags & ~(AI_PASSIVE|AI_CANONNAME|AI_NUMERICHOST|
  > > +    if (hints->ai_flags & 
  > > + ~(AI_PASSIVE|AI_CANONNAME|AI_NUMERICHOST|AI_NUMERICSERV|
  > >                             AI_ADDRCONFIG|AI_V4MAPPED|AI_ALL))
  > >         return EAI_BADFLAGS;
  > 
  > In my opinion you have to check if the string is not just a number 
  > with AI_NUMERICSERV flag high.
  > See the patch below.
  > 
  > For more detail see glibc patch
  > http://sourceware.org/ml/glibc-cvs/2004-q3/msg00296.html
  > Based on the following bug
  > http://sources.redhat.com/bugzilla/show_bug.cgi?id=296

Thanks!
Have you tested this?  If it works, then it sounds like a good idea to
check it in.  
(I will only be able to test this in about a week)

  > Regards
  > Filippo Arcidiacono.
  > 
  > 
  > --- uClibc-nptl/libc/inet/getaddrinfo.c	(revision 16)
  > +++ uClibc-nptl/libc/inet/getaddrinfo.c	(working copy)
  > @@ -823,7 +823,7 @@
  >  	hints = &default_hints;
  >  
  >      if (hints->ai_flags & ~(AI_PASSIVE|AI_CANONNAME|AI_NUMERICHOST|
  > -			    AI_ADDRCONFIG|AI_V4MAPPED|AI_ALL))
  > +
  > AI_ADDRCONFIG|AI_V4MAPPED|AI_NUMERICSERV|AI_ALL))
  >  	return EAI_BADFLAGS;
  >  
  >      if ((hints->ai_flags & AI_CANONNAME) && name == NULL)
  > @@ -834,8 +834,12 @@
  >  	char *c;
  >  	gaih_service.name = service;
  >  	gaih_service.num = strtoul (gaih_service.name, &c, 10);
  > -	if (*c)
  > +	if (*c != '\0') {
  > +		if (hints->ai_flags & AI_NUMERICSERV)
  > +			return EAI_NONAME;
  > +
  >  	    gaih_service.num = -1;
  > +	}
  >  	else
  >  	    /*
  >  	     * Can't specify a numerical socket unless a protocol
  > > _______________________________________________
  > > uClibc mailing list
  > > uClibc at uclibc.org
  > > http://busybox.net/cgi-bin/mailman/listinfo/uclibc
  > > 



More information about the uClibc mailing list