diff options
author | ray <> | 2007-02-15 04:25:35 +0000 |
---|---|---|
committer | ray <> | 2007-02-15 04:25:35 +0000 |
commit | 9c6d816b59ddf3a4a800cde1e364d9045b286645 (patch) | |
tree | 54fc21c54b56f6fad7521349b7c215b39b54e812 /src/lib/libc/net/getnameinfo.c | |
parent | 0c70b110e5fbbc2644ba8f7c65dacb9d1ac4e402 (diff) | |
download | openbsd-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.c | 44 |
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 *, | |||
88 | static int ip6_sa2str(const struct sockaddr_in6 *, char *, size_t, int); | 88 | static 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 | */ | ||
94 | void *__THREAD_NAME(serv_mutex); | 91 | void *__THREAD_NAME(serv_mutex); |
95 | 92 | ||
96 | int | 93 | int |
@@ -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) { |