summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorray <>2007-02-15 04:25:35 +0000
committerray <>2007-02-15 04:25:35 +0000
commit9c6d816b59ddf3a4a800cde1e364d9045b286645 (patch)
tree54fc21c54b56f6fad7521349b7c215b39b54e812
parent0c70b110e5fbbc2644ba8f7c65dacb9d1ac4e402 (diff)
downloadopenbsd-9c6d816b59ddf3a4a800cde1e364d9045b286645.tar.gz
openbsd-9c6d816b59ddf3a4a800cde1e364d9045b286645.tar.bz2
openbsd-9c6d816b59ddf3a4a800cde1e364d9045b286645.zip
Remove two mutexes by replacing getservbyname() and getservbyport()
calls with their reentrant versions. OK millert@.
-rw-r--r--src/lib/libc/net/getaddrinfo.c17
-rw-r--r--src/lib/libc/net/getnameinfo.c44
2 files changed, 29 insertions, 32 deletions
diff --git a/src/lib/libc/net/getaddrinfo.c b/src/lib/libc/net/getaddrinfo.c
index 01cc3a292b..f462b2a2c9 100644
--- a/src/lib/libc/net/getaddrinfo.c
+++ b/src/lib/libc/net/getaddrinfo.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: getaddrinfo.c,v 1.58 2007/02/14 05:48:46 ray Exp $ */ 1/* $OpenBSD: getaddrinfo.c,v 1.59 2007/02/15 04:25:35 ray Exp $ */
2/* $KAME: getaddrinfo.c,v 1.31 2000/08/31 17:36:43 itojun Exp $ */ 2/* $KAME: getaddrinfo.c,v 1.31 2000/08/31 17:36:43 itojun Exp $ */
3 3
4/* 4/*
@@ -826,11 +826,8 @@ static int
826get_port(struct addrinfo *ai, const char *servname, int matchonly) 826get_port(struct addrinfo *ai, const char *servname, int matchonly)
827{ 827{
828 const char *errstr, *proto; 828 const char *errstr, *proto;
829 struct servent *sp;
830 int port; 829 int port;
831 int allownumeric; 830 int allownumeric;
832 /* mutex is defined in getnameinfo.c */
833 extern void *__THREAD_NAME(serv_mutex);
834 831
835 if (servname == NULL) 832 if (servname == NULL)
836 return 0; 833 return 0;
@@ -864,6 +861,9 @@ get_port(struct addrinfo *ai, const char *servname, int matchonly)
864 return EAI_SERVICE; 861 return EAI_SERVICE;
865 port = htons(port); 862 port = htons(port);
866 } else { 863 } else {
864 struct servent sp;
865 struct servent_data sd;
866
867 if (errno == ERANGE) 867 if (errno == ERANGE)
868 return EAI_SERVICE; 868 return EAI_SERVICE;
869 if (ai->ai_flags & AI_NUMERICSERV) 869 if (ai->ai_flags & AI_NUMERICSERV)
@@ -881,12 +881,11 @@ get_port(struct addrinfo *ai, const char *servname, int matchonly)
881 break; 881 break;
882 } 882 }
883 883
884 _THREAD_PRIVATE_MUTEX_LOCK(serv_mutex); 884 (void)memset(&sd, 0, sizeof(sd));
885 sp = getservbyname(servname, proto); 885 if (getservbyname_r(servname, proto, &sp, &sd) == -1)
886 _THREAD_PRIVATE_MUTEX_UNLOCK(serv_mutex);
887 if (sp == NULL)
888 return EAI_SERVICE; 886 return EAI_SERVICE;
889 port = sp->s_port; 887 port = sp.s_port;
888 endservent_r(&sd);
890 } 889 }
891 890
892 if (!matchonly) { 891 if (!matchonly) {
diff --git a/src/lib/libc/net/getnameinfo.c b/src/lib/libc/net/getnameinfo.c
index 57e0ddf3be..7041a4ee48 100644
--- a/src/lib/libc/net/getnameinfo.c
+++ b/src/lib/libc/net/getnameinfo.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: getnameinfo.c,v 1.32 2006/11/17 01:11:23 itojun Exp $ */ 1/* $OpenBSD: getnameinfo.c,v 1.33 2007/02/15 04:25:35 ray Exp $ */
2/* $KAME: getnameinfo.c,v 1.45 2000/09/25 22:43:56 itojun Exp $ */ 2/* $KAME: getnameinfo.c,v 1.45 2000/09/25 22:43:56 itojun Exp $ */
3 3
4/* 4/*
@@ -88,9 +88,6 @@ static int ip6_parsenumeric(const struct sockaddr *, const char *, char *,
88static int ip6_sa2str(const struct sockaddr_in6 *, char *, size_t, int); 88static int ip6_sa2str(const struct sockaddr_in6 *, char *, size_t, int);
89#endif 89#endif
90 90
91/*
92 * this mutex is also used by get_port in getaddrinfo.c
93 */
94void *__THREAD_NAME(serv_mutex); 91void *__THREAD_NAME(serv_mutex);
95 92
96int 93int
@@ -98,7 +95,6 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host,
98 size_t hostlen, char *serv, size_t servlen, int flags) 95 size_t hostlen, char *serv, size_t servlen, int flags)
99{ 96{
100 const struct afd *afd; 97 const struct afd *afd;
101 struct servent *sp;
102 struct hostent *hp; 98 struct hostent *hp;
103 u_short port; 99 u_short port;
104 int family, i; 100 int family, i;
@@ -133,25 +129,27 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host,
133 * "||" here: rfc2553bis-03 says that serv == NULL OR 129 * "||" here: rfc2553bis-03 says that serv == NULL OR
134 * servlen == 0 means that the caller does not want the result. 130 * servlen == 0 means that the caller does not want the result.
135 */ 131 */
136 } else { 132 } else if (!(flags & NI_NUMERICSERV)) {
137 if (flags & NI_NUMERICSERV) 133 struct servent sp;
138 sp = NULL; 134 struct servent_data sd;
139 else { 135
140 _THREAD_PRIVATE_MUTEX_LOCK(serv_mutex); 136 (void)memset(&sd, 0, sizeof(sd));
141 sp = getservbyport(port, 137 if (getservbyport_r(port,
142 (flags & NI_DGRAM) ? "udp" : "tcp"); 138 (flags & NI_DGRAM) ? "udp" : "tcp", &sp, &sd) == -1)
143 _THREAD_PRIVATE_MUTEX_UNLOCK(serv_mutex); 139 goto numeric;
144 } 140
145 if (sp) { 141 if (strlen(sp.s_name) + 1 > servlen) {
146 if (strlen(sp->s_name) + 1 > servlen) 142 endservent_r(&sd);
147 return EAI_MEMORY; 143 return EAI_MEMORY;
148 strlcpy(serv, sp->s_name, servlen);
149 } else {
150 snprintf(numserv, sizeof(numserv), "%u", ntohs(port));
151 if (strlen(numserv) + 1 > servlen)
152 return EAI_MEMORY;
153 strlcpy(serv, numserv, servlen);
154 } 144 }
145 strlcpy(serv, sp.s_name, servlen);
146 endservent_r(&sd);
147 } else {
148 numeric:
149 i = snprintf(numserv, sizeof(numserv), "%u", ntohs(port));
150 if (i < 0 || i >= servlen || i >= sizeof(numserv))
151 return EAI_MEMORY;
152 strlcpy(serv, numserv, servlen);
155 } 153 }
156 154
157 switch (sa->sa_family) { 155 switch (sa->sa_family) {