Fix Solaris by ensuring we use the IPv4 or IPv6 length
authorJeremy Allison <jra@samba.org>
Fri, 2 Nov 2007 17:25:34 +0000 (10:25 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 2 Nov 2007 17:25:34 +0000 (10:25 -0700)
in any getnameinfo calls.
Jeremy
(This used to be commit 4d7badb0c44f287034f58d9a412e662c0fbecdc9)

source3/lib/interfaces.c
source3/lib/system.c
source3/lib/util_sock.c
source3/utils/net_lookup.c

index 38abb9299b789fc0aa95dae58b7a45e8da5a7e19..01481c50e9769c282155c261e10a3d7b742c882e 100644 (file)
@@ -696,6 +696,16 @@ int get_interfaces(struct iface_struct *ifaces, int max_interfaces)
 #ifdef AUTOCONF_TEST
 /* this is the autoconf driver to test get_interfaces() */
 
+static socklen_t calc_sa_size(struct sockaddr *psa)
+{
+       socklen_t sl = sizeof(struct sockaddr_in);
+#if defined(HAVE_IPV6)
+       if (psa->sa_family == AF_INET6) {
+               salen = sizeof(struct sockaddr_in6);
+       }
+#endif
+}
+
  int main()
 {
        struct iface_struct ifaces[MAX_INTERFACES];
@@ -710,22 +720,23 @@ int get_interfaces(struct iface_struct *ifaces, int max_interfaces)
        for (i=0;i<total;i++) {
                char addr[INET6_ADDRSTRLEN];
                int ret;
+               socklen_t sl;
                printf("%-10s ", ifaces[i].name);
                addr[0] = '\0';
                ret = getnameinfo((struct sockaddr *)&ifaces[i].ip,
-                               sizeof(ifaces[i].ip),
+                               calc_sa_size(&ifaces[i].ip),
                                addr, sizeof(addr),
                                NULL, 0, NI_NUMERICHOST);
                printf("IP=%s ", addr);
                addr[0] = '\0';
                ret = getnameinfo((struct sockaddr *)&ifaces[i].netmask,
-                               sizeof(ifaces[i].netmask),
+                               calc_sa_size(&ifaces[i].netmask),
                                addr, sizeof(addr),
                                NULL, 0, NI_NUMERICHOST);
                printf("NETMASK=%s ", addr);
                addr[0] = '\0';
                ret = getnameinfo((struct sockaddr *)&ifaces[i].bcast,
-                               sizeof(ifaces[i].bcast),
+                               calc_sa_size(&ifaces[i].bcast),
                                addr, sizeof(addr),
                                NULL, 0, NI_NUMERICHOST);
                printf("BCAST=%s\n", addr);
index 604228233cd78b13ad74c6d3c22daa05e6cf9de2..fe4e700176c28b813c73cc6d2663b7955ed2bf4e 100644 (file)
@@ -2545,3 +2545,27 @@ int sys_getpeereid( int s, uid_t *uid)
        return -1;
 #endif
 }
+
+int sys_getnameinfo(const struct sockaddr *psa,
+                       socklen_t salen,
+                       char *host,
+                       size_t hostlen,
+                       char *service,
+                       size_t servlen,
+                       int flags)
+{
+       /*
+        * For Solaris we must make sure salen is the
+        * correct length for the incoming sa_family.
+        */
+
+       if (salen == sizeof(struct sockaddr_storage)) {
+               salen = sizeof(struct sockaddr_in);
+#if defined(HAVE_IPV6)
+               if (psa->sa_family == AF_INET6) {
+                       salen = sizeof(struct sockaddr_in6);
+               }
+#endif
+       }
+       return getnameinfo(psa, salen, host, hostlen, service, servlen, flags);
+}
index bbcbcacb4ab22d5a739d41a773dabd00ccd21b02..b4fda54ebd7ba7e2ae74efa26fa246b5a77a3e65 100644 (file)
@@ -495,7 +495,7 @@ bool is_address_any(const struct sockaddr_storage *psa)
  Print out an IPv4 or IPv6 address from a struct sockaddr_storage.
 ****************************************************************************/
 
-char *print_sockaddr_len(char *dest,
+static char *print_sockaddr_len(char *dest,
                        size_t destlen,
                        const struct sockaddr_storage *psa,
                        socklen_t psalen)
@@ -503,7 +503,7 @@ char *print_sockaddr_len(char *dest,
        if (destlen > 0) {
                dest[0] = '\0';
        }
-       (void)getnameinfo((const struct sockaddr *)psa,
+       (void)sys_getnameinfo((const struct sockaddr *)psa,
                        psalen,
                        dest, destlen,
                        NULL, 0,
@@ -519,7 +519,8 @@ char *print_sockaddr(char *dest,
                        size_t destlen,
                        const struct sockaddr_storage *psa)
 {
-       return print_sockaddr_len(dest, destlen, psa, sizeof(*psa));
+       return print_sockaddr_len(dest, destlen, psa,
+                       sizeof(struct sockaddr_storage));
 }
 
 /****************************************************************************
index f7af1f2bb3ed305916b2674c5a3ccc5ce6d54307..5e3551b78137f992996b58584c11f58e070f0eff 100644 (file)
@@ -131,7 +131,7 @@ static int net_lookup_ldap(int argc, const char **argv)
                return -1;
        }
 
-       ret = getnameinfo((struct sockaddr *)&ss,
+       ret = sys_getnameinfo((struct sockaddr *)&ss,
                        sizeof(struct sockaddr_storage),
                        h_name, sizeof(h_name),
                        NULL, 0,