summaryrefslogtreecommitdiff
path: root/security/ssh/patches/patch-af
diff options
context:
space:
mode:
Diffstat (limited to 'security/ssh/patches/patch-af')
-rw-r--r--security/ssh/patches/patch-af560
1 files changed, 39 insertions, 521 deletions
diff --git a/security/ssh/patches/patch-af b/security/ssh/patches/patch-af
index 3240072f45c..c81c2dd2e99 100644
--- a/security/ssh/patches/patch-af
+++ b/security/ssh/patches/patch-af
@@ -1,7 +1,7 @@
-$NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
+$NetBSD: patch-af,v 1.10 2000/03/20 02:25:50 itojun Exp $
---- sshd.c.orig Wed May 12 13:19:29 1999
-+++ sshd.c Mon Mar 6 15:19:36 2000
+--- sshd.c- Wed May 12 20:19:29 1999
++++ sshd.c Mon Mar 20 09:57:30 2000
@@ -511,7 +511,7 @@
#include "firewall.h" /* TIS authsrv authentication */
#endif
@@ -41,228 +41,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
/* Server configuration options. */
ServerOptions options;
-@@ -553,6 +564,19 @@
- /* Name of the server configuration file. */
- char *config_file_name = SERVER_CONFIG_FILE;
-
-+/* Flag indicating whether IPv4 or IPv6. This can be set on the command line.
-+ Default value is AF_UNSPEC means both IPv4 and IPv6. */
-+#ifdef ENABLE_IPV6
-+int IPv4or6 = AF_UNSPEC;
-+#else
-+int IPv4or6 = AF_INET;
-+#endif
-+
-+#ifdef ENABLE_LOG_AUTH
-+char *unauthenticated_user = NULL;
-+int log_auth_flag = 0;
-+#endif /* ENABLE_LOG_AUTH */
-+
- /* Debug mode flag. This can be set on the command line. If debug
- mode is enabled, extra debugging output will be sent to the system
- log, the daemon will not go to background, and will exit after processing
-@@ -576,7 +600,17 @@
-
- /* This is set to the socket that the server is listening; this is used in
- the SIGHUP signal handler. */
--int listen_sock;
-+#define MAX_LISTEN_SOCKS 16
-+int listen_socks[MAX_LISTEN_SOCKS];
-+int num_listen_socks = 0;
-+void close_listen_socks()
-+{
-+ int i;
-+
-+ for (i = 0; i < num_listen_socks; i++)
-+ close(listen_socks[i]);
-+ num_listen_socks = -1;
-+}
-
- /* This is not really needed, and could be eliminated if server-specific
- and client-specific code were removed from newchannels.c */
-@@ -649,7 +683,6 @@
- const char *display, const char *auth_proto,
- const char *auth_data, const char *ttyname);
-
--
- /* Signal handler for SIGHUP. Sshd execs itself when it receives SIGHUP;
- the effect is to reread the configuration file (and to regenerate
- the server key). */
-@@ -666,7 +699,7 @@
- void sighup_restart(void)
- {
- log_msg("Received SIGHUP; restarting.");
-- close(listen_sock);
-+ close_listen_socks();
- execvp(saved_argv[0], saved_argv);
- log_msg("RESTART FAILED: av[0]='%.100s', error: %.100s.",
- saved_argv[0], strerror(errno));
-@@ -680,7 +713,7 @@
- RETSIGTYPE sigterm_handler(int sig)
- {
- log_msg("Received signal %d; terminating.", sig);
-- close(listen_sock);
-+ close_listen_socks();
- exit(255);
- }
-
-@@ -759,7 +792,7 @@
- int perm_denied = 0;
- int ret;
- fd_set fdset;
-- struct sockaddr_in sin;
-+ struct sockaddr_storage from;
- char buf[100]; /* Must not be larger than remote_version. */
- char remote_version[100]; /* Must be at least as big as buf. */
- char *comment;
-@@ -769,6 +802,9 @@
- struct linger linger;
- #endif /* SO_LINGER */
- int done;
-+ struct addrinfo *ai;
-+ char ntop[ADDRSTRLEN], strport[PORTSTRLEN];
-+ int listen_sock, maxfd;
-
- /* Save argv[0]. */
- saved_argv = av;
-@@ -787,10 +823,26 @@
- initialize_server_options(&options);
-
- /* Parse command-line arguments. */
-- while ((opt = getopt(ac, av, "f:p:b:k:h:g:diqV:")) != EOF)
-+ while ((opt = getopt(ac, av, "f:p:b:k:h:g:diqV:4"
-+#ifdef ENABLE_IPV6
-+ "6"
-+#endif
-+ )) != EOF)
- {
- switch (opt)
- {
-+ case '4':
-+#ifdef ENABLE_IPV6
-+ IPv4or6 = (IPv4or6 == AF_INET6) ? AF_UNSPEC : AF_INET;
-+#else
-+ IPv4or6 = AF_INET;
-+#endif
-+ break;
-+#ifdef ENABLE_IPV6
-+ case '6':
-+ IPv4or6 = (IPv4or6 == AF_INET) ? AF_UNSPEC : AF_INET6;
-+ break;
-+#endif
- case 'f':
- config_file_name = optarg;
- break;
-@@ -807,7 +859,7 @@
- options.server_key_bits = atoi(optarg);
- break;
- case 'p':
-- options.port = atoi(optarg);
-+ options.ports[options.num_ports++] = atoi(optarg);
- break;
- case 'g':
- options.login_grace_time = atoi(optarg);
-@@ -829,6 +881,10 @@
- fprintf(stderr, "sshd version %s [%s]\n", SSH_VERSION, HOSTTYPE);
- fprintf(stderr, "Usage: %s [options]\n", av0);
- fprintf(stderr, "Options:\n");
-+ fprintf(stderr, " -4 Use IPv4 only\n");
-+#ifdef ENABLE_IPV6
-+ fprintf(stderr, " -6 Use IPv6 only\n");
-+#endif
- fprintf(stderr, " -f file Configuration file (default %s/sshd_config)\n", ETCDIR);
- fprintf(stderr, " -d Debugging mode\n");
- fprintf(stderr, " -i Started from inetd\n");
-@@ -857,16 +913,15 @@
- fprintf(stderr, "fatal: Bad server key size.\n");
- exit(1);
- }
-- if (options.port < 1 || options.port > 65535)
-- {
-- fprintf(stderr, "fatal: Bad port number.\n");
-- exit(1);
-- }
- if (options.umask != -1)
- {
- umask(options.umask);
- }
-
-+#ifdef ENABLE_LOG_AUTH
-+ log_auth_flag = options.log_auth;
-+#endif /* ENABLE_LOG_AUTH */
-+
- /* Check that there are no remaining arguments. */
- if (optind < ac)
- {
-@@ -1034,10 +1089,13 @@
- }
- else
- {
-+ for (ai = options.listen_addrs; ai; ai = ai->ai_next)
-+ {
- /* Create socket for listening. */
-- listen_sock = socket(AF_INET, SOCK_STREAM, 0);
-+ listen_sock = socket(ai->ai_family, SOCK_STREAM, 0);
- if (listen_sock < 0)
- fatal("socket: %.100s", strerror(errno));
-+ listen_socks[num_listen_socks] = listen_sock;
-
- /* Set socket options. We try to make the port reusable and have it
- close as fast as possible without waiting in unnecessary wait states
-@@ -1051,21 +1109,30 @@
- sizeof(linger));
- #endif /* SO_LINGER */
-
-- /* Initialize the socket address. */
-- memset(&sin, 0, sizeof(sin));
-- sin.sin_family = AF_INET;
-- sin.sin_addr = options.listen_addr;
-- sin.sin_port = htons(options.port);
-+ getnameinfo(ai->ai_addr, ai->ai_addrlen,
-+ ntop, sizeof(ntop), strport, sizeof(strport),
-+ NI_NUMERICHOST|NI_NUMERICSERV);
-
- /* Bind the socket to the desired port. */
-- if (bind(listen_sock, (struct sockaddr *)&sin, sizeof(sin)) < 0)
-+ if (bind(listen_sock, ai->ai_addr, ai->ai_addrlen) < 0)
- {
-- error("bind: %.100s", strerror(errno));
-- shutdown(listen_sock, 2);
-+ error("Bind to port %s on %s failed: %.200s.",
-+ strport, ntop, strerror(errno));
- close(listen_sock);
-- fatal("Bind to port %d failed: %.200s.", options.port,
-- strerror(errno));
-+ continue;
- }
-+ num_listen_socks++;
-+
-+ /* Start listening on the port. */
-+ log_msg("Server listening on %s port %s.", ntop, strport);
-+ if (listen(listen_sock, 5) < 0)
-+ fatal("listen: %.100s", strerror(errno));
-+
-+ } /* for (ai = options.listen_addrs; ai; ai = ai->ai_next) */
-+ freeaddrinfo(options.listen_addrs);
-+
-+ if (!num_listen_socks)
-+ fatal("Cannot bind all addresses.");
-
- if (!debug_flag)
- {
-@@ -1081,11 +1148,6 @@
- }
- }
-
-- /* Start listening on the port. */
-- log_msg("Server listening on port %d.", options.port);
-- if (listen(listen_sock, 5) < 0)
-- fatal("listen: %.100s", strerror(errno));
--
- /* Generate an rsa key. */
- log_msg("Generating %d bit RSA key.", options.server_key_bits);
- rsa_generate_key(&sensitive_data.private_key, &public_key,
-@@ -1115,7 +1177,6 @@
+@@ -1115,7 +1126,6 @@
/* Arrange SIGCHLD to be caught. */
signal(SIGCHLD, main_sigchld_handler);
@@ -270,7 +49,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
#ifdef KRB5
/* Initialize contexts and setup replay cache */
if (!ssh_context)
-@@ -1128,7 +1189,6 @@
+@@ -1128,7 +1138,6 @@
krb5_init_ets(ssh_context);
}
#endif
@@ -278,70 +57,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
/* Stay listening for connections until the system crashes or the
daemon is killed with a signal. */
-@@ -1139,9 +1199,15 @@
-
- /* Wait in select until there is a connection. */
- FD_ZERO(&fdset);
-- FD_SET(listen_sock, &fdset);
-- ret = select(listen_sock + 1, &fdset, NULL, NULL, NULL);
-- if (ret < 0 || !FD_ISSET(listen_sock, &fdset))
-+ maxfd = 0;
-+ for (i = 0; i < num_listen_socks; i++)
-+ {
-+ FD_SET(listen_socks[i], &fdset);
-+ if (listen_socks[i] > maxfd)
-+ maxfd = listen_socks[i];
-+ }
-+ ret = select(maxfd + 1, &fdset, NULL, NULL, NULL);
-+ if (ret < 0)
- {
- if (errno == EINTR)
- continue;
-@@ -1149,8 +1215,12 @@
- continue;
- }
-
-- aux = sizeof(sin);
-- newsock = accept(listen_sock, (struct sockaddr *)&sin, &aux);
-+ for (i = 0; i < num_listen_socks; i++)
-+ {
-+ if (!FD_ISSET(listen_socks[i], &fdset))
-+ continue;
-+ aux = sizeof(from);
-+ newsock = accept(listen_socks[i], (struct sockaddr *)&from, &aux);
- if (newsock < 0)
- {
- if (errno == EINTR)
-@@ -1166,7 +1236,7 @@
- /* In debugging mode. Close the listening socket, and start
- processing the connection without forking. */
- debug("Server will not fork when running in debugging mode.");
-- close(listen_sock);
-+ close_listen_socks();
- sock_in = newsock;
- sock_out = newsock;
- pid = getpid();
-@@ -1195,7 +1265,7 @@
- the accepted socket. Reinitialize logging (since our
- pid has changed). We break out of the loop to handle
- the connection. */
-- close(listen_sock);
-+ close_listen_socks();
- sock_in = newsock;
- sock_out = newsock;
- #ifdef LIBWRAP
-@@ -1233,6 +1303,10 @@
-
- /* Close the new socket (the child is now taking care of it). */
- close(newsock);
-+ } /* for (i = 0; i < num_host_socks; i++) */
-+ /* child process check (or debug mode) */
-+ if (num_listen_socks < 0)
-+ break;
- }
- }
-
-@@ -1407,6 +1481,16 @@
+@@ -1407,6 +1416,16 @@
/* Try to remove authentication socket and directory */
auth_delete_socket(NULL);
@@ -358,7 +74,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
/* The connection has been terminated. */
log_msg("Closing connection to %.100s", get_remote_ipaddr());
packet_close();
-@@ -1470,17 +1554,17 @@
+@@ -1470,17 +1489,17 @@
if (options.tis_authentication)
auth_mask |= 1 << SSH_AUTH_TIS;
#endif
@@ -381,7 +97,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
#endif
if (options.password_authentication)
auth_mask |= 1 << SSH_AUTH_PASSWORD;
-@@ -1677,7 +1761,7 @@
+@@ -1677,7 +1696,7 @@
/* XXX No days_before_password_expires calculation here */
}
#endif /* HAVE_USERSEC_H */
@@ -390,7 +106,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
{
struct spwd *sp;
-@@ -1783,56 +1867,62 @@
+@@ -1783,56 +1802,62 @@
endspent();
}
#endif /* HAVE_ETC_SHADOW */
@@ -476,7 +192,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
#ifdef HAVE_HPUX_TCB_AUTH
{
-@@ -2039,7 +2129,7 @@
+@@ -2039,7 +2064,7 @@
}
}
@@ -485,7 +201,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
grp = getgrgid(pwd->pw_gid);
if (grp)
group = grp->gr_name;
-@@ -2151,12 +2241,12 @@
+@@ -2151,12 +2176,12 @@
unsigned int client_host_key_bits;
MP_INT client_host_key_e, client_host_key_n;
int password_attempts = 0;
@@ -501,7 +217,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
login_cap_t *lc;
const char *hostname;
const char *ipaddr;
-@@ -2167,10 +2257,18 @@
+@@ -2167,10 +2192,18 @@
ipaddr = get_remote_ipaddr();
#endif /* HAVE_LOGIN_CAP_H */
@@ -521,20 +237,16 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
/* For KRB5 allow the user to input fully qualified name i.e.
"username@realm" as the local user name. Then use this name to call
out to krb5_aname_to_localname to find if there is a localname
-@@ -2203,8 +2301,11 @@
+@@ -2203,7 +2236,7 @@
}
else
krb5_parse_name(ssh_context, user, &client);
-#endif /* defined(KERBEROS) && defined(KRB5) */
+#endif /* KRB5 */
-+#ifdef ENABLE_LOG_AUTH
-+ unauthenticated_user = user;
-+#endif /* ENABLE_LOG_AUTH */
/* Verify that the user is a valid user. We disallow usernames starting
with any characters that are commonly used to start NIS entries. */
- pw = getpwnam(user);
-@@ -2218,11 +2319,11 @@
+@@ -2218,11 +2251,11 @@
pwcopy.pw_passwd = xstrdup(pw->pw_passwd);
pwcopy.pw_uid = pw->pw_uid;
pwcopy.pw_gid = pw->pw_gid;
@@ -548,7 +260,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
pwcopy.pw_dir = xstrdup(pw->pw_dir);
pwcopy.pw_shell = xstrdup(pw->pw_shell);
pw = &pwcopy;
-@@ -2241,11 +2342,11 @@
+@@ -2241,11 +2274,11 @@
debug("Attempting authentication for %.100s.", user);
@@ -563,7 +275,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
#if defined (HAVE_SIA)
/* For SIA, only call auth_password() here if the user really
has no password. Otherwise, the call would generate misleading
-@@ -2254,12 +2355,21 @@
+@@ -2254,9 +2287,13 @@
if (options.password_authentication && sia_no_password(user) &&
auth_password(user, ""))
#else /* defined(HAVE_SIA) */
@@ -579,15 +291,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
{
/* Authentication with empty password succeeded. */
debug("Login for user %.100s accepted without authentication.", user);
-+#ifdef ENABLE_LOG_AUTH
-+ log_auth("%.100s from %.700s (%s)",
-+ user, get_canonical_hostname(),
-+ "empty password accepted");
-+#endif /* ENABLE_LOG_AUTH */
- authentication_type = SSH_AUTH_PASSWORD;
- authenticated = 1;
- /* Success packet will be sent after loop below. */
-@@ -2281,34 +2391,61 @@
+@@ -2281,34 +2318,61 @@
/* Process the packet. */
switch (type)
{
@@ -657,7 +361,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
case SSH_CMSG_AUTH_KERBEROS:
if (!options.kerberos_authentication)
{
-@@ -2316,9 +2453,10 @@
+@@ -2316,9 +2380,10 @@
log_msg("Kerberos authentication disabled.");
break;
}
@@ -669,19 +373,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
{
char *tkt_user;
-@@ -2334,6 +2472,11 @@
- /* Client has successfully authenticated to us. */
- log_msg("Kerberos authentication accepted %.100s for login to account %.100s from %.200s",
- tkt_user, user, get_canonical_hostname());
-+#ifdef ENABLE_LOG_AUTH
-+ log_auth("%.100s from %.700s (%s)",
-+ user, get_canonical_hostname(),
-+ "kerberos authentication accepted");
-+#endif /* ENABLE_LOG_AUTH */
- authentication_type = SSH_AUTH_KERBEROS;
- authenticated = 1;
- break;
-@@ -2347,11 +2490,31 @@
+@@ -2347,11 +2412,31 @@
}
free(tkt_user);
}
@@ -717,43 +409,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
case SSH_CMSG_AUTH_RHOSTS:
if (!options.rhosts_authentication)
-@@ -2382,6 +2545,11 @@
- /* Authentication accepted. */
- log_msg("Rhosts authentication accepted for %.100s, remote %.100s on %.700s.",
- user, client_user, get_canonical_hostname());
-+#ifdef ENABLE_LOG_AUTH
-+ log_auth("%.100s from %.100s@%.700s (%s)",
-+ user, client_user, get_canonical_hostname(),
-+ "rhosts authentication accepted");
-+#endif /* ENABLE_LOG_AUTH */
- authentication_type = SSH_AUTH_RHOSTS;
- authenticated = 1;
- remote_user_name = client_user;
-@@ -2441,6 +2609,11 @@
- options.strict_modes))
- {
- /* Authentication accepted. */
-+#ifdef ENABLE_LOG_AUTH
-+ log_auth("%.100s from %.100s@%.700s (%s)",
-+ user, client_user, get_canonical_hostname(),
-+ "rhosts with RSA host authentication accepted");
-+#endif /* ENABLE_LOG_AUTH */
- authentication_type = SSH_AUTH_RHOSTS_RSA;
- authenticated = 1;
- remote_user_name = client_user;
-@@ -2474,6 +2647,11 @@
- /* Successful authentication. */
- mpz_clear(&n);
- log_msg("RSA authentication for %.100s accepted.", user);
-+#ifdef ENABLE_LOG_AUTH
-+ log_auth("%.100s from %.700s (%s)",
-+ user, get_canonical_hostname(),
-+ "RSA user authentication accepted");
-+#endif /* ENABLE_LOG_AUTH */
- authentication_type = SSH_AUTH_RSA;
- authenticated = 1;
- break;
-@@ -2568,7 +2746,7 @@
+@@ -2568,7 +2653,7 @@
if (!strncmp(buf, "challenge ", 10) ||
!strncmp(buf, "chalnecho ", 10)) {
snprintf(prompt, sizeof(prompt),
@@ -762,19 +418,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
debug("TIS challenge %.500s", buf);
packet_start(SSH_SMSG_AUTH_TIS_CHALLENGE);
packet_put_string(prompt, strlen(prompt));
-@@ -2608,6 +2786,11 @@
- auth_close();
- memset(password, 0, strlen(password));
- xfree(password);
-+#ifdef ENABLE_LOG_AUTH
-+ log_auth("%.100s from @%.700s (%s)",
-+ user, get_canonical_hostname(),
-+ "TIS authentication accepted");
-+#endif /* ENABLE_LOG_AUTH */
- authentication_type = SSH_AUTH_TIS;
- authenticated = 1;
- break;
-@@ -2657,17 +2840,22 @@
+@@ -2657,11 +2742,11 @@
password_attempts++;
/* Try authentication with the password. */
@@ -789,18 +433,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
{
/* Successful authentication. */
/* Clear the password from memory. */
- memset(password, 0, strlen(password));
- xfree(password);
- log_msg("Password authentication for %.100s accepted.", user);
-+#ifdef ENABLE_LOG_AUTH
-+ log_auth("%.100s from %.700s (%s)",
-+ user, get_canonical_hostname(),
-+ "password authentication accepted");
-+#endif /* ENABLE_LOG_AUTH */
- authentication_type = SSH_AUTH_PASSWORD;
- authenticated = 1;
- break;
-@@ -2688,7 +2876,7 @@
+@@ -2688,7 +2773,7 @@
if (authenticated)
break;
@@ -809,7 +442,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
/* If you forwarded a ticket you get one shot for proper
authentication. */
/* If tgt was passed unlink file */
-@@ -2699,7 +2887,7 @@
+@@ -2699,7 +2784,7 @@
else
ticket = NULL;
}
@@ -818,19 +451,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
/* Send a message indicating that the authentication attempt failed. */
packet_start(SSH_SMSG_FAILURE);
-@@ -2708,6 +2896,11 @@
- }
-
- /* Check if the user is logging in as root and root logins are disallowed. */
-+#ifdef ENABLE_LOG_AUTH
-+ if ((pw->pw_uid == UID_ROOT && options.permit_root_login == 1) ||
-+ (pw->pw_uid == UID_ROOT && options.permit_root_login == 0 && !forced_command))
-+ log_auth("ROOT LOGIN REFUSED FROM %.200s", get_canonical_hostname());
-+#endif /* ENABLE_LOG_AUTH */
- if (pw->pw_uid == UID_ROOT && options.permit_root_login == 1)
- {
- if (authentication_type == SSH_AUTH_PASSWORD)
-@@ -2724,7 +2917,7 @@
+@@ -2724,7 +2809,7 @@
get_canonical_hostname());
}
@@ -839,17 +460,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
lc = login_getclass(pw->pw_class);
-@@ -2775,6 +2968,9 @@
- packet_start(SSH_SMSG_SUCCESS);
- packet_send();
- packet_write_wait();
-+#ifdef ENABLE_LOG_AUTH
-+ unauthenticated_user = NULL;
-+#endif /* ENABLE_LOG_AUTH */
-
- /* Perform session preparation. */
- do_authenticated(pw);
-@@ -2965,6 +3161,21 @@
+@@ -2965,6 +3050,21 @@
display = x11_create_display_inet(screen);
if (!display)
goto fail;
@@ -871,12 +482,8 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
break;
#else /* XAUTH_PATH */
/* No xauth program; we won't accept forwarding with spoofing. */
-@@ -3280,15 +3491,12 @@
- char line[256];
- struct stat st;
- int quiet_login;
-- struct sockaddr_in from;
-+ struct sockaddr_storage from;
+@@ -3283,12 +3383,9 @@
+ struct sockaddr_in from;
int fromlen;
struct pty_cleanup_context cleanup_context;
-#if defined (__FreeBSD__) && defined(HAVE_LOGIN_CAP_H)
@@ -889,19 +496,16 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
/* We no longer need the child running on user's privileges. */
userfile_uninit();
-@@ -3387,9 +3595,9 @@
-
- /* Record that there was a login on that terminal. */
+@@ -3389,7 +3486,7 @@
record_login(pid, ttyname, pw->pw_name, pw->pw_uid, hostname,
-- &from);
-+ (struct sockaddr *)&from);
+ &from);
-#if defined (__FreeBSD__) && defined(HAVE_LOGIN_CAP_H)
+#if (defined (__FreeBSD__) || defined(__NetBSD__)) && defined(HAVE_LOGIN_CAP_H)
lc = login_getclass(pw->pw_class);
#endif
-@@ -3398,7 +3606,7 @@
+@@ -3398,7 +3495,7 @@
snprintf(line, sizeof(line), "%.200s/.hushlogin", pw->pw_dir);
quiet_login = stat(line, &st) >= 0;
@@ -910,7 +514,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
quiet_login = login_getcapbool(lc, "hushlogin", quiet_login);
#endif
-@@ -3425,7 +3633,7 @@
+@@ -3425,7 +3522,7 @@
}
#endif /* HAVE_SIA */
@@ -919,7 +523,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
if (command == NULL && !quiet_login)
{
#ifdef HAVE_LOGIN_CAP_H
-@@ -3457,7 +3665,7 @@
+@@ -3457,7 +3554,7 @@
FILE *f;
/* Print /etc/motd if it exists. */
@@ -928,7 +532,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
f = fopen(login_getcapstr(lc, "welcome", "/etc/motd", "/etc/motd"),
"r");
#else
-@@ -3469,33 +3677,9 @@
+@@ -3469,33 +3566,9 @@
fputs(line, stdout);
fclose(f);
}
@@ -963,15 +567,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
login_close(lc);
#endif
-@@ -3876,6 +4060,7 @@
- char *user_shell;
- char *remote_ip;
- int remote_port;
-+ int local_port;
- #if defined (__FreeBSD__) && defined(HAVE_LOGIN_CAP_H)
- login_cap_t *lc;
- char *real_shell;
-@@ -3883,8 +4068,11 @@
+@@ -3883,8 +3956,11 @@
lc = login_getclass(pw->pw_class);
auth_checknologin(lc);
#else /* !HAVE_LOGIN_CAP_H */
@@ -984,23 +580,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
if ((lc = login_getclass(pw->pw_class)) == NULL)
{
-@@ -3981,6 +4169,7 @@
- user_shell = xstrdup(pw->pw_shell);
- remote_ip = xstrdup(get_remote_ipaddr());
- remote_port = get_remote_port();
-+ local_port = get_local_port();
-
- /* Close the connection descriptors; note that this is the child, and the
- server will still have the socket open, and it is important that we
-@@ -4000,7 +4189,6 @@
- /* Close any extra file descriptors. Note that there may still be
- descriptors left by system functions. They will be closed later. */
- endpwent();
-- endhostent();
-
- /* Set dummy encryption key to clear information about the key from
- memory. This key will never be used. */
-@@ -4019,7 +4207,7 @@
+@@ -4019,7 +4095,7 @@
if (command != NULL || !options.use_login)
#endif /* USELOGIN */
{
@@ -1009,7 +589,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
char *p, *s, **tmpenv;
/* Initialize the new environment.
-@@ -4180,10 +4368,23 @@
+@@ -4180,10 +4256,23 @@
and means /bin/sh. */
shell = (user_shell[0] == '\0') ? DEFAULT_SHELL : user_shell;
@@ -1034,16 +614,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
/* Initialize the environment if not already done. In the first part we
allocate space for all environment variables. */
if (env == NULL)
-@@ -4257,7 +4458,7 @@
-
- /* Set SSH_CLIENT. */
- snprintf(buf, sizeof(buf),
-- "%.50s %d %d", remote_ip, remote_port, options.port);
-+ "%.50s %d %d", remote_ip, remote_port, local_port);
- child_set_env(&env, &envsize, "SSH_CLIENT", buf);
-
- /* Set SSH_TTY if we have a pty. */
-@@ -4290,13 +4491,21 @@
+@@ -4290,13 +4379,21 @@
}
#endif
@@ -1068,60 +639,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
/* Set variable for forwarded authentication connection, if we have one. */
if (auth_get_socket_name() != NULL)
-@@ -4426,7 +4635,8 @@
- int i;
- char name[255], *p;
- char line[256];
-- struct hostent *hp;
-+ struct addrinfo hints, *ai, *aitop;
-+ char ntop[ADDRSTRLEN];
-
- strncpy(name, display, sizeof(name));
- name[sizeof(name) - 1] = '\0';
-@@ -4443,7 +4653,10 @@
- /* Moved this call here to avoid a nasty buf in SunOS
- 4.1.4 libc where gethostbyname closes an unrelated
- file descriptor. */
-- hp = gethostbyname(name);
-+ memset(&hints, 0, sizeof(hints));
-+ hints.ai_family = IPv4or6;
-+ if (getaddrinfo(name, NULL, &hints, &aitop) != 0)
-+ aitop = 0;
-
- snprintf(line, sizeof(line),
- "%.200s -q -", options.xauth_path);
-@@ -4461,21 +4674,24 @@
- cp - display, display, cp, auth_proto,
- auth_data);
- #endif
-- if (hp)
-+ if (aitop)
- {
-- for(i = 0; hp->h_addr_list[i]; i++)
-+ for (ai = aitop; ai; ai = ai->ai_next)
- {
-+ getnameinfo(ai->ai_addr, ai->ai_addrlen,
-+ ntop, sizeof(ntop), NULL, 0,
-+ NI_NUMERICHOST);
-+ if (strchr(ntop, ':'))
-+ continue; /* XXX - xauth doesn't accept it */
- if (debug_flag)
- {
- fprintf(stderr, "Running %s add %s%s %s %s\n",
- options.xauth_path,
-- inet_ntoa(*((struct in_addr *)
-- hp->h_addr_list[i])),
-+ ntop,
- cp, auth_proto, auth_data);
- }
- fprintf(f, "add %s%s %s %s\n",
-- inet_ntoa(*((struct in_addr *)
-- hp->h_addr_list[i])),
-+ ntop,
- cp, auth_proto, auth_data);
- }
- }
-@@ -4554,7 +4770,7 @@
+@@ -4554,7 +4651,7 @@
/* Execute the shell. */
argv[0] = buf;
argv[1] = NULL;
@@ -1130,7 +648,7 @@ $NetBSD: patch-af,v 1.9 2000/03/06 14:34:18 mjl Exp $
execve(real_shell, argv, env);
#else
execve(shell, argv, env);
-@@ -4579,7 +4795,7 @@
+@@ -4579,7 +4676,7 @@
argv[1] = "-c";
argv[2] = (char *)command;
argv[3] = NULL;