about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--sysdeps/posix/getaddrinfo.c24
2 files changed, 17 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 873f95d7d7..c050fb1fc7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2000-01-18  Ulrich Drepper  <drepper@cygnus.com>
 
+	* sysdeps/posix/getaddrinfo.c: Correct modifications done for
+	PR1515.  Patch by Hideaki YOSHIFUJI <yoshfuji@ecei.tohoku.ac.jp>.
+
 	* posix/regex.h (RE_SYNTAX_POSIX_EXTENDED): Add RE_CONTEXT_INVALID_OPS.
 	* posix/regex.c (regex_compile): Return appropriate errors for
 	unterminated brace expressions.  Detect invalid characters
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 9b66676e1c..4bb80c8820 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -100,8 +100,8 @@ struct gaih_typeproto
 
 static struct gaih_typeproto gaih_inet_typeproto[] =
 {
-  { 0, 0, NULL },
-  { SOCK_STREAM, IPPROTO_TCP, (char *) "tcp" ,0 },
+  { 0, 0, NULL, 0 },
+  { SOCK_STREAM, IPPROTO_TCP, (char *) "tcp", 0 },
   { SOCK_DGRAM, IPPROTO_UDP, (char *) "udp", 0 },
   { SOCK_RAW, IPPROTO_RAW, (char *) "raw", GAI_PROTO_NOSERVICE },
   { 0, 0, NULL, 0 }
@@ -145,10 +145,10 @@ gaih_local (const char *name, const struct gaih_service *service,
       struct gaih_typeproto *tp = gaih_inet_typeproto + 1;
 
       while (tp->name != NULL
-	     && (req->ai_socktype != tp->socktype || req->ai_socktype == 0)
 	     && ((tp->protoflag & GAI_PROTO_NOSERVICE) != 0
-		 || req->ai_protocol != tp->protocol
-		 || req->ai_protocol == 0))
+		 || (req->ai_socktype != 0 && req->ai_socktype != tp->socktype)
+		 || (req->ai_protocol != 0
+		     && req->ai_protocol != tp->protocol)))
 	++tp;
 
       if (tp->name == NULL)
@@ -299,10 +299,9 @@ gaih_inet (const char *name, const struct gaih_service *service,
       ++tp;
 
       while (tp->name != NULL
-	     && (req->ai_socktype != tp->socktype || req->ai_socktype == 0)
-	     && ((tp->protoflag & GAI_PROTO_NOSERVICE) != 0
-		 || req->ai_protocol != tp->protocol
-		 || req->ai_protocol == 0))
+	     && ((req->ai_socktype != 0 && req->ai_socktype != tp->socktype)
+		 || (req->ai_protocol != 0
+		     && req->ai_protocol != tp->protocol)))
 	++tp;
 
       if (tp->name == NULL)
@@ -334,7 +333,12 @@ gaih_inet (const char *name, const struct gaih_service *service,
 	      struct gaih_servtuple **pst = &st;
 	      for (tp++; tp->name; tp++)
 		{
-		  struct gaih_servtuple *newp = (struct gaih_servtuple *)
+		  struct gaih_servtuple *newp;
+
+		  if ((tp->protoflag & GAI_PROTO_NOSERVICE) != 0)
+		    continue;
+
+		  newp = (struct gaih_servtuple *)
 		    __alloca (sizeof (struct gaih_servtuple));
 
 		  if ((rc = gaih_inet_serv (service->name, tp, newp)))