about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog40
-rw-r--r--sysdeps/posix/getaddrinfo.c20
2 files changed, 52 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index da1c9f5025..56f93857d0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,43 @@
+2004-08-05  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/posix/getaddrinfo.c (gaih_inet): Recognize all the IPv4
+	numeric address formats inet_addr knows.
+	(getaddrinfo): Allow AI_NUMERICSERV flag.
+	If neither IPv4 nor IPv6 inerface is present we cannot make any
+	decision for AI_ADDRCONFIG.  Fail if AI_NUMERICSERV is set and the
+	string is not just a number.  Remove useless freeaddrinfo call.
+	* resolv/netdb.h (AI_NUMERICSERV): Define.
+	Based on a patch by a.guru@sympatico.ca.
+
+2004-08-04  Jakub Jelinek  <jakub@redhat.com>
+
+	* stdlib/strfmon_l.c (__vstrfmon_l): Memset whole info structure
+	instead of trying to initialize some, but not all, fields one by
+	one.
+	* stdio-common/printf_size.c (printf_size): Initialize fb_info
+	structure with *info instead of trying to initialize some, but not
+	all, fields from it.
+
+	* nscd/connections.c (handle_request): Check if req->type is in
+	LASTDBREQ .. LASTREQ range instead of req.
+
+	* locale/programs/linereader.c (lr_create): Initialize
+	lr->return_widestr to 0.
+
+	* elf/dl-close.c (free_slotinfo): Add __libc_freeres_fn_section.
+	(free_mem): Call free_slotinfo just once.
+
+	* stdio-common/tst-fmemopen.c (main): Check for MAP_FAILED instead
+	of NULL.
+
+	* locale/localeinfo.h (_nl_locale_subfreeres): New prototype.
+	* locale/setlocale.c (free_category): Add __libc_freeres_fn_section.
+	(free_mem): Rename to _nl_locale_subfreeres.
+	* iconv/gconv_db.c: Include locale/localeinfo.h.
+	(free_derivation, free_modules_db): Add __libc_freeres_fn_section.
+	(free_mem): Call _nl_locale_subfreeres.
+	* iconv/gconv_dl.c (do_release_all): Add __libc_freeres_fn_section.
+
 2004-08-04  Roland McGrath  <roland@frob.com>
 
 	* Makeconfig ($(common-objpfx)config.status):
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index bc5f0699a3..e3986d9519 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -575,16 +575,17 @@ gaih_inet (const char *name, const struct gaih_service *service,
 	}
 #endif
 
-      if (inet_pton (AF_INET, name, at->addr) > 0)
+      if (__inet_aton (name, (struct in_addr *) at->addr) != 0)
 	{
 	  if (req->ai_family == AF_UNSPEC || req->ai_family == AF_INET)
 	    at->family = AF_INET;
-	  else if (req->ai_flags & AI_V4MAPPED)
+	  else if (req->ai_family == AF_INET6 && req->ai_flags & AI_V4MAPPED)
 	    {
 	      ((uint32_t *) at->addr)[3] = *(uint32_t *) at->addr;
 	      ((uint32_t *) at->addr)[2] = htonl (0xffff);
 	      ((uint32_t *) at->addr)[1] = 0;
 	      ((uint32_t *) at->addr)[0] = 0;
+	      at->family = AF_INET6;
 	    }
 	  else
 	    return -EAI_ADDRFAMILY;
@@ -1323,7 +1324,7 @@ getaddrinfo (const char *name, const char *service,
 	  |AI_IDN|AI_CANONIDN|AI_IDN_ALLOW_UNASSIGNED
 	  |AI_IDN_USE_STD3_ASCII_RULES
 #endif
-	  |AI_ALL))
+	  |AI_NUMERICSERV|AI_ALL))
     return EAI_BADFLAGS;
 
   if ((hints->ai_flags & AI_CANONNAME) && name == NULL)
@@ -1339,7 +1340,7 @@ getaddrinfo (const char *name, const char *service,
       __check_pf (&seen_ipv4, &seen_ipv6);
 
       /* Now make a decision on what we return, if anything.  */
-      if (hints->ai_family == PF_UNSPEC)
+      if (hints->ai_family == PF_UNSPEC && (seen_ipv4 || seen_ipv6))
 	{
 	  /* If we haven't seen both IPv4 and IPv6 interfaces we can
 	     narrow down the search.  */
@@ -1361,8 +1362,13 @@ getaddrinfo (const char *name, const char *service,
       char *c;
       gaih_service.name = service;
       gaih_service.num = strtoul (gaih_service.name, &c, 10);
-      if (*c)
-	gaih_service.num = -1;
+      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 family was
 	   given. */
@@ -1467,8 +1473,6 @@ getaddrinfo (const char *name, const char *service,
   if (pai == NULL && last_i == 0)
     return 0;
 
-  freeaddrinfo (p);
-
   return last_i ? -(last_i & GAIH_EAI) : EAI_NONAME;
 }
 libc_hidden_def (getaddrinfo)