Ignore port when pulling IP addr from struct sockaddr_storage.
authorGerald (Jerry) Carter <jerry@samba.org>
Mon, 24 Mar 2008 19:48:29 +0000 (14:48 -0500)
committerGerald (Jerry) Carter <jerry@samba.org>
Mon, 24 Mar 2008 22:25:13 +0000 (17:25 -0500)
Linux man page states that getaddinfo() will leave the port
uninitialized when passing in NULL for the service name.  So we
can't really trust that anymore.  I doubt non-default KDC ports
are an issues so just drop the port from the generated krb5.conf.
AIX exhibits this bug the most.
(This used to be commit 36f8bafbd3dee66a869aa26cfc2eb4aa62019325)

source3/lib/util_sock.c

index 65625138ba38789cb73f7da521fa91ff183b921b..8ceabe19b2258d9183aeaf25f852edca1ccf8ea8 100644 (file)
@@ -108,9 +108,13 @@ static bool interpret_string_addr_internal(struct addrinfo **ppres,
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_flags = flags;
 
+       /* Linux man page on getaddinfo() says port will be
+          uninitialized when service string in NULL */
+
        ret = getaddrinfo(str, NULL,
                        &hints,
                        ppres);
+
        if (ret) {
                DEBUG(3,("interpret_string_addr_internal: getaddrinfo failed "
                        "for name %s [%s]\n",
@@ -541,50 +545,22 @@ char *print_canonical_sockaddr(TALLOC_CTX *ctx,
        char *dest = NULL;
        int ret;
 
+       /* Linux getnameinfo() man pages says port is unitialized if
+          service name is NULL. */
+
        ret = sys_getnameinfo((const struct sockaddr *)pss,
                        sizeof(struct sockaddr_storage),
                        addr, sizeof(addr),
                        NULL, 0,
                        NI_NUMERICHOST);
-       if (ret) {
+       if (ret != 0) {
                return NULL;
        }
-       if (pss->ss_family != AF_INET) {
 #if defined(HAVE_IPV6)
-               /* IPv6 */
-               const struct sockaddr_in6 *sa6 =
-                       (const struct sockaddr_in6 *)pss;
-               uint16_t port = ntohs(sa6->sin6_port);
-
-               if (port) {
-                       dest = talloc_asprintf(ctx,
-                                       "[%s]:%d",
-                                       addr,
-                                       (unsigned int)port);
-               } else {
-                       dest = talloc_asprintf(ctx,
-                                       "[%s]",
-                                       addr);
-               }
+       dest = talloc_asprintf(ctx, "[%s]", addr);
 #else
-               return NULL;
+       dest = talloc_asprintf(ctx, "%s", addr);
 #endif
-       } else {
-               const struct sockaddr_in *sa =
-                       (const struct sockaddr_in *)pss;
-               uint16_t port = ntohs(sa->sin_port);
-
-               if (port) {
-                       dest = talloc_asprintf(ctx,
-                                       "%s:%d",
-                                       addr,
-                                       (unsigned int)port);
-               } else {
-                       dest = talloc_asprintf(ctx,
-                                       "%s",
-                                       addr);
-               }
-       }
        return dest;
 }