[ping] [patch] getaddrinfo bug
Dan Nicolaescu
dann at ics.uci.edu
Fri Feb 8 16:43:53 PST 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