summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-07-22 22:09:45 -0400
committerRich Felker <dalias@aerifal.cx>2012-07-22 22:09:45 -0400
commit845a5e69fa33bf49eea81a7b8c80902ab1687f2e (patch)
treed8a961f1e8cddba414c0ecd2544f1637ada3e263 /src/network
parentefe72c561925a711d8dbc7894ef27fe823205e21 (diff)
downloadmusl-845a5e69fa33bf49eea81a7b8c80902ab1687f2e.tar.gz
remove scanf dependency from getaddrinfo /etc/services support
Diffstat (limited to 'src/network')
-rw-r--r--src/network/getaddrinfo.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c
index d16b6561..83862166 100644
--- a/src/network/getaddrinfo.c
+++ b/src/network/getaddrinfo.c
@@ -79,18 +79,17 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
if (!*z && port > 65535) return EAI_SERVICE;
if (!port) {
size_t servlen = strlen(serv);
- char protname[4];
+ char *end = line;
if (flags & AI_NUMERICSERV) return EAI_SERVICE;
f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
if (!f) return EAI_SERVICE;
while (fgets(line, sizeof line, f)) {
- if (strncmp(line, serv, servlen))
+ if (strncmp(line, serv, servlen) || !isspace(line[servlen]))
continue;
- if (sscanf(line+servlen, "%lu/%3s", &port, protname) < 2)
- continue;
- if (strcmp(protname, proto==IPPROTO_UDP ? "udp" : "tcp"))
+ port = strtoul(line+servlen, &end, 10);
+ if (strncmp(end, proto==IPPROTO_UDP ? "/udp" : "/tcp", 4))
continue;
break;
}