]> andersk Git - openssh.git/blobdiff - canohost.c
- (tim) [configure.ac sshd.8] Enable locked account check (a "*LK*" string)
[openssh.git] / canohost.c
index 8ad684d6c383d81843101743180d89760100ef13..bd7f830dea4590f97071f5b9473303279740c4b2 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: canohost.c,v 1.41 2004/07/21 11:51:29 djm Exp $");
+RCSID("$OpenBSD: canohost.c,v 1.47 2005/11/03 13:38:29 dtucker Exp $");
 
 #include "packet.h"
 #include "xmalloc.h"
@@ -20,7 +20,6 @@ RCSID("$OpenBSD: canohost.c,v 1.41 2004/07/21 11:51:29 djm Exp $");
 #include "canohost.h"
 
 static void check_ip_options(int, char *);
-static void ipv64_normalise_mapped(struct sockaddr_storage *, socklen_t *);
 
 /*
  * Return the canonical name of the host at the other end of the socket. The
@@ -44,9 +43,6 @@ get_remote_hostname(int sock, int use_dns)
                cleanup_exit(255);
        }
 
-       if (from.ss_family == AF_INET)
-               check_ip_options(sock, ntop);
-
        ipv64_normalise_mapped(&from, &fromlen);
 
        if (from.ss_family == AF_INET6)
@@ -56,6 +52,9 @@ get_remote_hostname(int sock, int use_dns)
            NULL, 0, NI_NUMERICHOST) != 0)
                fatal("get_remote_hostname: getnameinfo NI_NUMERICHOST failed");
 
+       if (from.ss_family == AF_INET)
+               check_ip_options(sock, ntop);
+
        if (!use_dns)
                return xstrdup(ntop);
 
@@ -144,7 +143,8 @@ check_ip_options(int sock, char *ipaddr)
        u_char options[200];
        char text[sizeof(options) * 3 + 1];
        socklen_t option_size;
-       int i, ipproto;
+       u_int i;
+       int ipproto;
        struct protoent *ip;
 
        if ((ip = getprotobyname("ip")) != NULL)
@@ -158,15 +158,13 @@ check_ip_options(int sock, char *ipaddr)
                for (i = 0; i < option_size; i++)
                        snprintf(text + i*3, sizeof(text) - i*3,
                            " %2.2x", options[i]);
-               logit("Connection from %.100s with IP options:%.800s",
-                   ipaddr, text);
-               packet_disconnect("Connection from %.100s with IP options:%.800s",
+               fatal("Connection from %.100s with IP options:%.800s",
                    ipaddr, text);
        }
 #endif /* IP_OPTIONS */
 }
 
-static void
+void
 ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len)
 {
        struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)addr;
@@ -174,7 +172,7 @@ ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len)
        struct in_addr inaddr;
        u_int16_t port;
 
-       if (addr->ss_family != AF_INET6 || 
+       if (addr->ss_family != AF_INET6 ||
            !IN6_IS_ADDR_V4MAPPED(&a6->sin6_addr))
                return;
 
@@ -200,26 +198,27 @@ ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len)
 const char *
 get_canonical_hostname(int use_dns)
 {
+       char *host;
        static char *canonical_host_name = NULL;
-       static int use_dns_done = 0;
+       static char *remote_ip = NULL;
 
        /* Check if we have previously retrieved name with same option. */
-       if (canonical_host_name != NULL) {
-               if (use_dns_done != use_dns)
-                       xfree(canonical_host_name);
-               else
-                       return canonical_host_name;
-       }
+       if (use_dns && canonical_host_name != NULL)
+               return canonical_host_name;
+       if (!use_dns && remote_ip != NULL)
+               return remote_ip;
 
        /* Get the real hostname if socket; otherwise return UNKNOWN. */
        if (packet_connection_is_on_socket())
-               canonical_host_name = get_remote_hostname(
-                   packet_get_connection_in(), use_dns);
+               host = get_remote_hostname(packet_get_connection_in(), use_dns);
        else
-               canonical_host_name = xstrdup("UNKNOWN");
+               host = "UNKNOWN";
 
-       use_dns_done = use_dns;
-       return canonical_host_name;
+       if (use_dns)
+               canonical_host_name = host;
+       else
+               remote_ip = host;
+       return host;
 }
 
 /*
@@ -232,6 +231,7 @@ get_socket_address(int sock, int remote, int flags)
        struct sockaddr_storage addr;
        socklen_t addrlen;
        char ntop[NI_MAXHOST];
+       int r;
 
        /* Get IP address of client. */
        addrlen = sizeof(addr);
@@ -251,10 +251,13 @@ get_socket_address(int sock, int remote, int flags)
        if (addr.ss_family == AF_INET6)
                addrlen = sizeof(struct sockaddr_in6);
 
+       ipv64_normalise_mapped(&addr, &addrlen);
+
        /* Get the address in ascii. */
-       if (getnameinfo((struct sockaddr *)&addr, addrlen, ntop, sizeof(ntop),
-           NULL, 0, flags) != 0) {
-               error("get_socket_address: getnameinfo %d failed", flags);
+       if ((r = getnameinfo((struct sockaddr *)&addr, addrlen, ntop,
+           sizeof(ntop), NULL, 0, flags)) != 0) {
+               error("get_socket_address: getnameinfo %d failed: %s", flags,
+                   r == EAI_SYSTEM ? strerror(errno) : gai_strerror(r));
                return NULL;
        }
        return xstrdup(ntop);
@@ -330,6 +333,7 @@ get_sock_port(int sock, int local)
        struct sockaddr_storage from;
        socklen_t fromlen;
        char strport[NI_MAXSERV];
+       int r;
 
        /* Get IP address of client. */
        fromlen = sizeof(from);
@@ -342,7 +346,7 @@ get_sock_port(int sock, int local)
        } else {
                if (getpeername(sock, (struct sockaddr *)&from, &fromlen) < 0) {
                        debug("getpeername failed: %.100s", strerror(errno));
-                       cleanup_exit(255);
+                       return -1;
                }
        }
 
@@ -351,9 +355,10 @@ get_sock_port(int sock, int local)
                fromlen = sizeof(struct sockaddr_in6);
 
        /* Return port number. */
-       if (getnameinfo((struct sockaddr *)&from, fromlen, NULL, 0,
-           strport, sizeof(strport), NI_NUMERICSERV) != 0)
-               fatal("get_sock_port: getnameinfo NI_NUMERICSERV failed");
+       if ((r = getnameinfo((struct sockaddr *)&from, fromlen, NULL, 0,
+           strport, sizeof(strport), NI_NUMERICSERV)) != 0)
+               fatal("get_sock_port: getnameinfo NI_NUMERICSERV failed: %s",
+                   r == EAI_SYSTEM ? strerror(errno) : gai_strerror(r));
        return atoi(strport);
 }
 
This page took 0.042175 seconds and 4 git commands to generate.