delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2009/03/27/09:33:29

X-Recipient: archive-cygwin AT delorie DOT com
X-SWARE-Spam-Status: No, hits=-3.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW,SPF_HELO_PASS,SPF_PASS
X-Spam-Check-By: sourceware.org
To: cygwin AT cygwin DOT com
From: Eric Blake <ebb9 AT byu DOT net>
Subject: [1.7] getaddrinfo failure
Date: Fri, 27 Mar 2009 14:32:58 +0000 (UTC)
Lines: 155
Message-ID: <loom.20090327T142800-289@post.gmane.org>
Mime-Version: 1.0
User-Agent: Loom/3.14 (http://gmane.org/)
X-IsSubscribed: yes
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

The coreutils testsuite includes a test of getaddrinfo (simplified slightly 
before attaching here), and it is failing for me on a Windows XP machine (I 
don't have access to Windows Vista to see if it behaves any better there).  I 
have not yet built a debugging cygwin1.dll to try to figure out where the 
EFAULT is resulting from, but it seems like this is probably a bug in cygwin 
itself, as the testcase looks like it is calling everything with proper 
pointers.

$ cat foo.c
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

/* Whether to print debugging messages.  */
#define ENABLE_DEBUGGING 1

#if ENABLE_DEBUGGING
# define dbgprintf printf
#else
# define dbgprintf if (0) printf
#endif

/* BeOS does not have AF_UNSPEC.  */
#ifndef AF_UNSPEC
# define AF_UNSPEC 0
#endif

#ifndef EAI_SERVICE
# define EAI_SERVICE 0
#endif

int simple (char *host, char *service)
{
  char buf[BUFSIZ];
  static int skip = 0;
  struct addrinfo *ai0, *ai;
  int res;
  int err;

  /* Once we skipped the test, do not try anything else */
  if (skip)
    return 0;

  dbgprintf ("Finding %s service %s...\n", host, service);

  errno = 0;
  res = getaddrinfo (host, service, 0, &ai0);
  err = errno;

  dbgprintf ("res %d: %s\n", res, gai_strerror (res));

  if (res != 0)
    {
      /* EAI_AGAIN is returned if no network is available. Don't fail
	 the test merely because someone is down the country on their
	 in-law's farm. */
      if (res == EAI_AGAIN)
	{
	  skip++;
	  fprintf (stderr, "skipping getaddrinfo test: no network?\n");
	  return 77;
	}
      /* IRIX reports EAI_NONAME for "https".  Don't fail the test
	 merely because of this.  */
      if (res == EAI_NONAME)
	return 0;
      /* Solaris reports EAI_SERVICE for "http" and "https".  Don't
         fail the test merely because of this.  */
      if (res == EAI_SERVICE)
	return 0;
      /* AIX reports EAI_NODATA for "https".  Don't fail the test
	 merely because of this.  */
      if (res == EAI_NODATA)
	return 0;
      if (res == EAI_SYSTEM)
         dbgprintf ("system error: %s\n", strerror (err));

      return 1;
    }

  for (ai = ai0; ai; ai = ai->ai_next)
    {
      dbgprintf ("\tflags %x\n", ai->ai_flags);
      dbgprintf ("\tfamily %x\n", ai->ai_family);
      dbgprintf ("\tsocktype %x\n", ai->ai_socktype);
      dbgprintf ("\tprotocol %x\n", ai->ai_protocol);
      dbgprintf ("\taddrlen %ld: ", (unsigned long) ai->ai_addrlen);
      dbgprintf ("\tFound %s\n",
		 inet_ntop (ai->ai_family,
			    &((struct sockaddr_in *)
			      ai->ai_addr)->sin_addr,
			    buf, sizeof (buf) - 1));
      if (ai->ai_canonname)
	dbgprintf ("\tFound %s...\n", ai->ai_canonname);

      {
	char ipbuf[BUFSIZ];
	char portbuf[BUFSIZ];

	res = getnameinfo (ai->ai_addr, ai->ai_addrlen,
			   ipbuf, sizeof (ipbuf) - 1,
			   portbuf, sizeof (portbuf) - 1,
			   NI_NUMERICHOST|NI_NUMERICSERV);
	dbgprintf ("\t\tgetnameinfo %d: %s\n", res, gai_strerror (res));
	if (res == 0)
	  {
	    dbgprintf ("\t\tip %s\n", ipbuf);
	    dbgprintf ("\t\tport %s\n", portbuf);
	  }
      }

    }

  freeaddrinfo (ai0);

  return 0;
}

#define HOST1 "www.gnu.org"
#define SERV1 "http"
#define HOST2 "www.ibm.com"
#define SERV2 "https"
#define HOST3 "microsoft.com"
#define SERV3 "http"
#define HOST4 "google.org"
#define SERV4 "ldap"

int main (void)
{
  return simple (HOST1, SERV1)
    + simple (HOST2, SERV2)
    + simple (HOST3, SERV3)
    + simple (HOST4, SERV4);
}
$ ./foo
Finding www.gnu.org service http...
res 11: System error returned in errno
system error: Bad address
Finding www.ibm.com service https...
res 11: System error returned in errno
system error: Bad address
Finding microsoft.com service http...
res 11: System error returned in errno
system error: Bad address
Finding google.org service ldap...
res 11: System error returned in errno
system error: Bad address

-- 
Eric Blake




--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019