improve name lookup performance in corner cases
[musl] / src / network / getaddrinfo.c
index 90e85f6..93c7516 100644 (file)
@@ -13,7 +13,7 @@ static int is_valid(const char *host)
 {
        const unsigned char *s;
        if (strlen(host)-1 > 254 || mbstowcs(0, host, 0) > 255) return 0;
-       for (s=host; *s>=0x80 || *s=='.' || *s=='-' || isalnum(*s); s++);
+       for (s=(void *)host; *s>=0x80 || *s=='.' || *s=='-' || isalnum(*s); s++);
        return !*s;
 }
 
@@ -61,7 +61,7 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
        //char hostbuf[256];
        char line[512];
        FILE *f, _f;
-       unsigned char _buf[64];
+       unsigned char _buf[1024];
        char *z;
        int result;
        int cnt;
@@ -75,7 +75,8 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
                type = proto==IPPROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;
 
        if (serv) {
-               port = strtoul(serv, &z, 0);
+               if (!*serv) return EAI_SERVICE;
+               port = strtoul(serv, &z, 10);
                if (!*z && port > 65535) return EAI_SERVICE;
                if (!port) {
                        if (flags & AI_NUMERICSERV) return EAI_SERVICE;
@@ -107,6 +108,8 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
                return 0;
        }
 
+       if (!*host) return EAI_NONAME;
+
        /* Try as a numeric address */
        if (__ipparse(&sa, family, host) >= 0) {
                buf = calloc(sizeof *buf, 1+EXTRA);
@@ -117,6 +120,7 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
                buf->ai.ai_addr = (void *)&buf->sa;
                buf->ai.ai_addrlen = family==AF_INET6 ? sizeof sa.sin6 : sizeof sa.sin;
                buf->ai.ai_family = family;
+               buf->ai.ai_canonname = (char *)host;
                buf->sa = sa;
                buf->sa.sin.sin_port = port;
                *res = &buf->ai;