]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ipaddr/ng_ipaddr.c
Check for sockaddr_in.sin_len and initialize it
[ngircd-alex.git] / src / ipaddr / ng_ipaddr.c
index 3b0595d79719b92b13edfd0f4a5422311f1ff550..4f1d4ca40492562858e87357c107c320b85c48b2 100644 (file)
@@ -24,18 +24,19 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
        int ret;
        char portstr[64];
        struct addrinfo *res0;
-       struct addrinfo hints = {
-#ifndef WANT_IPV6      /* only accept v4 addresses */
-               .ai_family = AF_INET,
-#endif
-               .ai_flags = AI_NUMERICHOST
-       };
+       struct addrinfo hints;
+
+       assert(ip_str);
+
+       memset(&hints, 0, sizeof(hints));
+       hints.ai_flags = AI_NUMERICHOST;
 
-       if (ip_str == NULL)
-               hints.ai_flags |= AI_PASSIVE;
+       /* some getaddrinfo implementations require that ai_socktype is set. */
+       hints.ai_socktype = SOCK_STREAM;
 
        /* silly, but ngircd stores UINT16 in server config, not string */
        snprintf(portstr, sizeof(portstr), "%u", (unsigned int) port);
+
        ret = getaddrinfo(ip_str, portstr, &hints, &res0);
        assert(ret == 0);
        if (ret != 0)
@@ -49,8 +50,11 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
        freeaddrinfo(res0);
        return ret == 0;
 #else /* HAVE_GETADDRINFO */
-       if (ip_str == NULL)
-               ip_str = "0.0.0.0";
+       assert(ip_str);
+       memset(addr, 0, sizeof *addr);
+#ifdef HAVE_sockaddr_in_len
+       addr->sin4.sin_len = sizeof(addr->sin4);
+#endif
        addr->sin4.sin_family = AF_INET;
 # ifdef HAVE_INET_ATON
        if (inet_aton(ip_str, &addr->sin4.sin_addr) == 0)
@@ -151,7 +155,8 @@ ng_ipaddr_tostr_r(const ng_ipaddr_t *addr, char *str)
        if (*str == ':') {
                char tmp[NG_INET_ADDRSTRLEN] = "0";
                ret = getnameinfo(sa, ng_ipaddr_salen(addr),
-                               tmp+1, sizeof(tmp) -1, NULL, 0, NI_NUMERICHOST);
+                                 tmp + 1, (socklen_t)sizeof(tmp) - 1,
+                                 NULL, 0, NI_NUMERICHOST);
                if (ret == 0)
                        strlcpy(str, tmp, NG_INET_ADDRSTRLEN);
        }