summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/getnameinfo.c
diff options
context:
space:
mode:
authorray <>2007-02-15 04:25:35 +0000
committerray <>2007-02-15 04:25:35 +0000
commit9c6d816b59ddf3a4a800cde1e364d9045b286645 (patch)
tree54fc21c54b56f6fad7521349b7c215b39b54e812 /src/lib/libc/net/getnameinfo.c
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@.
Diffstat (limited to 'src/lib/libc/net/getnameinfo.c')
-rw-r--r--src/lib/libc/net/getnameinfo.c44
1 files changed, 21 insertions, 23 deletions
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) {