remove scanf dependency from getaddrinfo /etc/services support

This commit is contained in:
Rich Felker 2012-07-22 22:09:45 -04:00
commit 845a5e69fa

View file

@ -79,18 +79,17 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
if (!*z && port > 65535) return EAI_SERVICE; if (!*z && port > 65535) return EAI_SERVICE;
if (!port) { if (!port) {
size_t servlen = strlen(serv); size_t servlen = strlen(serv);
char protname[4]; char *end = line;
if (flags & AI_NUMERICSERV) return EAI_SERVICE; if (flags & AI_NUMERICSERV) return EAI_SERVICE;
f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf); f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
if (!f) return EAI_SERVICE; if (!f) return EAI_SERVICE;
while (fgets(line, sizeof line, f)) { while (fgets(line, sizeof line, f)) {
if (strncmp(line, serv, servlen)) if (strncmp(line, serv, servlen) || !isspace(line[servlen]))
continue; continue;
if (sscanf(line+servlen, "%lu/%3s", &port, protname) < 2) port = strtoul(line+servlen, &end, 10);
continue; if (strncmp(end, proto==IPPROTO_UDP ? "/udp" : "/tcp", 4))
if (strcmp(protname, proto==IPPROTO_UDP ? "udp" : "tcp"))
continue; continue;
break; break;
} }