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 | |
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@.
-rw-r--r-- | src/lib/libc/net/getaddrinfo.c | 17 | ||||
-rw-r--r-- | src/lib/libc/net/getnameinfo.c | 44 |
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 | |||
826 | get_port(struct addrinfo *ai, const char *servname, int matchonly) | 826 | get_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 *, | |||
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) { |