fix uninitialized scopeid in lookups from hosts file and ip literals
[musl] / src / network / lookup_serv.c
index a9be0f3..4faa5bc 100644 (file)
@@ -7,13 +7,43 @@
 #include "lookup.h"
 #include "stdio_impl.h"
 
-int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int proto, int flags)
+int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int proto, int socktype, int flags)
 {
        char line[128];
        int cnt = 0;
        char *p, *z = "";
        unsigned long port = 0;
 
+       switch (socktype) {
+       case SOCK_STREAM:
+               switch (proto) {
+               case 0:
+                       proto = IPPROTO_TCP;
+               case IPPROTO_TCP:
+                       break;
+               default:
+                       return EAI_SERVICE;
+               }
+               break;
+       case SOCK_DGRAM:
+               switch (proto) {
+               case 0:
+                       proto = IPPROTO_UDP;
+               case IPPROTO_UDP:
+                       break;
+               default:
+                       return EAI_SERVICE;
+               }
+       case 0:
+               break;
+       default:
+               if (name) return EAI_SERVICE;
+               buf[0].port = 0;
+               buf[0].proto = proto;
+               buf[0].socktype = socktype;
+               return 1;
+       }
+
        if (name) {
                if (!*name) return EAI_SERVICE;
                port = strtoul(name, &z, 10);
@@ -22,10 +52,12 @@ int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int pro
                if (port > 65535) return EAI_SERVICE;
                if (proto != IPPROTO_UDP) {
                        buf[cnt].port = port;
+                       buf[cnt].socktype = SOCK_STREAM;
                        buf[cnt++].proto = IPPROTO_TCP;
                }
                if (proto != IPPROTO_TCP) {
                        buf[cnt].port = port;
+                       buf[cnt].socktype = SOCK_DGRAM;
                        buf[cnt++].proto = IPPROTO_UDP;
                }
                return cnt;
@@ -58,11 +90,13 @@ int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int pro
                if (!strncmp(z, "/udp", 4)) {
                        if (proto == IPPROTO_TCP) continue;
                        buf[cnt].port = port;
+                       buf[cnt].socktype = SOCK_DGRAM;
                        buf[cnt++].proto = IPPROTO_UDP;
                }
                if (!strncmp(z, "/tcp", 4)) {
                        if (proto == IPPROTO_UDP) continue;
                        buf[cnt].port = port;
+                       buf[cnt].socktype = SOCK_STREAM;
                        buf[cnt++].proto = IPPROTO_TCP;
                }
        }