[patch] getaddrinfo bug

Dan Nicolaescu dann at ics.uci.edu
Tue Jan 15 15:55:37 UTC 2008


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;




More information about the uClibc mailing list