remove unused #undef environ now that libc.h no longer #defines it
[musl] / src / network / getaddrinfo.c
index d16b656..3d7b9ec 100644 (file)
@@ -47,7 +47,7 @@ struct aibuf {
 /* Extra slots needed for storing canonical name */
 #define EXTRA ((256+sizeof(struct aibuf)-1)/sizeof(struct aibuf))
 
-int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint, struct addrinfo **res)
+int getaddrinfo(const char *restrict host, const char *restrict serv, const struct addrinfo *restrict hint, struct addrinfo **restrict res)
 {
        int flags = hint ? hint->ai_flags : 0;
        int family = hint ? hint->ai_family : AF_UNSPEC;
@@ -76,27 +76,26 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
        if (serv) {
                if (!*serv) return EAI_SERVICE;
                port = strtoul(serv, &z, 10);
-               if (!*z && port > 65535) return EAI_SERVICE;
-               if (!port) {
+               if (*z) {
                        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;
                        }
                        __fclose_ca(f);
                        if (feof(f)) return EAI_SERVICE;
                }
+               if (port > 65535) return EAI_SERVICE;
                port = htons(port);
        }
 
@@ -220,7 +219,7 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
                while (j--) buf[i++].sa.sin.sin_family = AF_INET6;
        }
 
-       if (__dns_get_rr((void *)&buf[cnt], 0, 256, 1, reply, RR_CNAME, 1) < 0)
+       if (__dns_get_rr((void *)&buf[cnt], 0, 256, 1, reply, RR_CNAME, 1) <= 0)
                strcpy((void *)&buf[cnt], host);
 
        for (i=0; i<cnt; i++) {