xref: /freebsd/crypto/openssh/session.c (revision 2f513db72b034fd5ef7f080b11be5c711c15186a)
1 /* $OpenBSD: session.c,v 1.307 2018/10/04 00:10:11 djm Exp $ */
2 /*
3  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4  *                    All rights reserved
5  *
6  * As far as I am concerned, the code I have written for this software
7  * can be used freely for any purpose.  Any derived versions of this
8  * software must be clearly marked as such, and if the derived work is
9  * incompatible with the protocol description in the RFC file, it must be
10  * called by a name other than "ssh" or "Secure Shell".
11  *
12  * SSH2 support by Markus Friedl.
13  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions
17  * are met:
18  * 1. Redistributions of source code must retain the above copyright
19  *    notice, this list of conditions and the following disclaimer.
20  * 2. Redistributions in binary form must reproduce the above copyright
21  *    notice, this list of conditions and the following disclaimer in the
22  *    documentation and/or other materials provided with the distribution.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 #include "includes.h"
37 __RCSID("$FreeBSD$");
38 
39 #include <sys/types.h>
40 #include <sys/param.h>
41 #ifdef HAVE_SYS_STAT_H
42 # include <sys/stat.h>
43 #endif
44 #include <sys/socket.h>
45 #include <sys/un.h>
46 #include <sys/wait.h>
47 
48 #include <arpa/inet.h>
49 
50 #include <ctype.h>
51 #include <errno.h>
52 #include <fcntl.h>
53 #include <grp.h>
54 #include <netdb.h>
55 #ifdef HAVE_PATHS_H
56 #include <paths.h>
57 #endif
58 #include <pwd.h>
59 #include <signal.h>
60 #include <stdarg.h>
61 #include <stdio.h>
62 #include <stdlib.h>
63 #include <string.h>
64 #include <unistd.h>
65 #include <limits.h>
66 
67 #include "openbsd-compat/sys-queue.h"
68 #include "xmalloc.h"
69 #include "ssh.h"
70 #include "ssh2.h"
71 #include "sshpty.h"
72 #include "packet.h"
73 #include "sshbuf.h"
74 #include "ssherr.h"
75 #include "match.h"
76 #include "uidswap.h"
77 #include "compat.h"
78 #include "channels.h"
79 #include "sshkey.h"
80 #include "cipher.h"
81 #ifdef GSSAPI
82 #include "ssh-gss.h"
83 #endif
84 #include "hostfile.h"
85 #include "auth.h"
86 #include "auth-options.h"
87 #include "authfd.h"
88 #include "pathnames.h"
89 #include "log.h"
90 #include "misc.h"
91 #include "servconf.h"
92 #include "sshlogin.h"
93 #include "serverloop.h"
94 #include "canohost.h"
95 #include "session.h"
96 #include "kex.h"
97 #include "monitor_wrap.h"
98 #include "sftp.h"
99 #include "atomicio.h"
100 
101 #if defined(KRB5) && defined(USE_AFS)
102 #include <kafs.h>
103 #endif
104 
105 #ifdef WITH_SELINUX
106 #include <selinux/selinux.h>
107 #endif
108 
109 #define IS_INTERNAL_SFTP(c) \
110 	(!strncmp(c, INTERNAL_SFTP_NAME, sizeof(INTERNAL_SFTP_NAME) - 1) && \
111 	 (c[sizeof(INTERNAL_SFTP_NAME) - 1] == '\0' || \
112 	  c[sizeof(INTERNAL_SFTP_NAME) - 1] == ' ' || \
113 	  c[sizeof(INTERNAL_SFTP_NAME) - 1] == '\t'))
114 
115 /* func */
116 
117 Session *session_new(void);
118 void	session_set_fds(struct ssh *, Session *, int, int, int, int, int);
119 void	session_pty_cleanup(Session *);
120 void	session_proctitle(Session *);
121 int	session_setup_x11fwd(struct ssh *, Session *);
122 int	do_exec_pty(struct ssh *, Session *, const char *);
123 int	do_exec_no_pty(struct ssh *, Session *, const char *);
124 int	do_exec(struct ssh *, Session *, const char *);
125 void	do_login(struct ssh *, Session *, const char *);
126 void	do_child(struct ssh *, Session *, const char *);
127 #ifdef LOGIN_NEEDS_UTMPX
128 static void	do_pre_login(Session *s);
129 #endif
130 void	do_motd(void);
131 int	check_quietlogin(Session *, const char *);
132 
133 static void do_authenticated2(struct ssh *, Authctxt *);
134 
135 static int session_pty_req(struct ssh *, Session *);
136 
137 /* import */
138 extern ServerOptions options;
139 extern char *__progname;
140 extern int debug_flag;
141 extern u_int utmp_len;
142 extern int startup_pipe;
143 extern void destroy_sensitive_data(void);
144 extern struct sshbuf *loginmsg;
145 extern struct sshauthopt *auth_opts;
146 char *tun_fwd_ifnames; /* serverloop.c */
147 
148 /* original command from peer. */
149 const char *original_command = NULL;
150 
151 /* data */
152 static int sessions_first_unused = -1;
153 static int sessions_nalloc = 0;
154 static Session *sessions = NULL;
155 
156 #define SUBSYSTEM_NONE			0
157 #define SUBSYSTEM_EXT			1
158 #define SUBSYSTEM_INT_SFTP		2
159 #define SUBSYSTEM_INT_SFTP_ERROR	3
160 
161 #ifdef HAVE_LOGIN_CAP
162 login_cap_t *lc;
163 #endif
164 
165 static int is_child = 0;
166 static int in_chroot = 0;
167 
168 /* File containing userauth info, if ExposeAuthInfo set */
169 static char *auth_info_file = NULL;
170 
171 /* Name and directory of socket for authentication agent forwarding. */
172 static char *auth_sock_name = NULL;
173 static char *auth_sock_dir = NULL;
174 
175 /* removes the agent forwarding socket */
176 
177 static void
178 auth_sock_cleanup_proc(struct passwd *pw)
179 {
180 	if (auth_sock_name != NULL) {
181 		temporarily_use_uid(pw);
182 		unlink(auth_sock_name);
183 		rmdir(auth_sock_dir);
184 		auth_sock_name = NULL;
185 		restore_uid();
186 	}
187 }
188 
189 static int
190 auth_input_request_forwarding(struct ssh *ssh, struct passwd * pw)
191 {
192 	Channel *nc;
193 	int sock = -1;
194 
195 	if (auth_sock_name != NULL) {
196 		error("authentication forwarding requested twice.");
197 		return 0;
198 	}
199 
200 	/* Temporarily drop privileged uid for mkdir/bind. */
201 	temporarily_use_uid(pw);
202 
203 	/* Allocate a buffer for the socket name, and format the name. */
204 	auth_sock_dir = xstrdup("/tmp/ssh-XXXXXXXXXX");
205 
206 	/* Create private directory for socket */
207 	if (mkdtemp(auth_sock_dir) == NULL) {
208 		packet_send_debug("Agent forwarding disabled: "
209 		    "mkdtemp() failed: %.100s", strerror(errno));
210 		restore_uid();
211 		free(auth_sock_dir);
212 		auth_sock_dir = NULL;
213 		goto authsock_err;
214 	}
215 
216 	xasprintf(&auth_sock_name, "%s/agent.%ld",
217 	    auth_sock_dir, (long) getpid());
218 
219 	/* Start a Unix listener on auth_sock_name. */
220 	sock = unix_listener(auth_sock_name, SSH_LISTEN_BACKLOG, 0);
221 
222 	/* Restore the privileged uid. */
223 	restore_uid();
224 
225 	/* Check for socket/bind/listen failure. */
226 	if (sock < 0)
227 		goto authsock_err;
228 
229 	/* Allocate a channel for the authentication agent socket. */
230 	nc = channel_new(ssh, "auth socket",
231 	    SSH_CHANNEL_AUTH_SOCKET, sock, sock, -1,
232 	    CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
233 	    0, "auth socket", 1);
234 	nc->path = xstrdup(auth_sock_name);
235 	return 1;
236 
237  authsock_err:
238 	free(auth_sock_name);
239 	if (auth_sock_dir != NULL) {
240 		rmdir(auth_sock_dir);
241 		free(auth_sock_dir);
242 	}
243 	if (sock != -1)
244 		close(sock);
245 	auth_sock_name = NULL;
246 	auth_sock_dir = NULL;
247 	return 0;
248 }
249 
250 static void
251 display_loginmsg(void)
252 {
253 	int r;
254 
255 	if (sshbuf_len(loginmsg) == 0)
256 		return;
257 	if ((r = sshbuf_put_u8(loginmsg, 0)) != 0)
258 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
259 	printf("%s", (char *)sshbuf_ptr(loginmsg));
260 	sshbuf_reset(loginmsg);
261 }
262 
263 static void
264 prepare_auth_info_file(struct passwd *pw, struct sshbuf *info)
265 {
266 	int fd = -1, success = 0;
267 
268 	if (!options.expose_userauth_info || info == NULL)
269 		return;
270 
271 	temporarily_use_uid(pw);
272 	auth_info_file = xstrdup("/tmp/sshauth.XXXXXXXXXXXXXXX");
273 	if ((fd = mkstemp(auth_info_file)) == -1) {
274 		error("%s: mkstemp: %s", __func__, strerror(errno));
275 		goto out;
276 	}
277 	if (atomicio(vwrite, fd, sshbuf_mutable_ptr(info),
278 	    sshbuf_len(info)) != sshbuf_len(info)) {
279 		error("%s: write: %s", __func__, strerror(errno));
280 		goto out;
281 	}
282 	if (close(fd) != 0) {
283 		error("%s: close: %s", __func__, strerror(errno));
284 		goto out;
285 	}
286 	success = 1;
287  out:
288 	if (!success) {
289 		if (fd != -1)
290 			close(fd);
291 		free(auth_info_file);
292 		auth_info_file = NULL;
293 	}
294 	restore_uid();
295 }
296 
297 static void
298 set_fwdpermit_from_authopts(struct ssh *ssh, const struct sshauthopt *opts)
299 {
300 	char *tmp, *cp, *host;
301 	int port;
302 	size_t i;
303 
304 	if ((options.allow_tcp_forwarding & FORWARD_LOCAL) != 0) {
305 		channel_clear_permission(ssh, FORWARD_USER, FORWARD_LOCAL);
306 		for (i = 0; i < auth_opts->npermitopen; i++) {
307 			tmp = cp = xstrdup(auth_opts->permitopen[i]);
308 			/* This shouldn't fail as it has already been checked */
309 			if ((host = hpdelim(&cp)) == NULL)
310 				fatal("%s: internal error: hpdelim", __func__);
311 			host = cleanhostname(host);
312 			if (cp == NULL || (port = permitopen_port(cp)) < 0)
313 				fatal("%s: internal error: permitopen port",
314 				    __func__);
315 			channel_add_permission(ssh,
316 			    FORWARD_USER, FORWARD_LOCAL, host, port);
317 			free(tmp);
318 		}
319 	}
320 	if ((options.allow_tcp_forwarding & FORWARD_REMOTE) != 0) {
321 		channel_clear_permission(ssh, FORWARD_USER, FORWARD_REMOTE);
322 		for (i = 0; i < auth_opts->npermitlisten; i++) {
323 			tmp = cp = xstrdup(auth_opts->permitlisten[i]);
324 			/* This shouldn't fail as it has already been checked */
325 			if ((host = hpdelim(&cp)) == NULL)
326 				fatal("%s: internal error: hpdelim", __func__);
327 			host = cleanhostname(host);
328 			if (cp == NULL || (port = permitopen_port(cp)) < 0)
329 				fatal("%s: internal error: permitlisten port",
330 				    __func__);
331 			channel_add_permission(ssh,
332 			    FORWARD_USER, FORWARD_REMOTE, host, port);
333 			free(tmp);
334 		}
335 	}
336 }
337 
338 void
339 do_authenticated(struct ssh *ssh, Authctxt *authctxt)
340 {
341 	setproctitle("%s", authctxt->pw->pw_name);
342 
343 	auth_log_authopts("active", auth_opts, 0);
344 
345 	/* setup the channel layer */
346 	/* XXX - streamlocal? */
347 	set_fwdpermit_from_authopts(ssh, auth_opts);
348 
349 	if (!auth_opts->permit_port_forwarding_flag ||
350 	    options.disable_forwarding) {
351 		channel_disable_admin(ssh, FORWARD_LOCAL);
352 		channel_disable_admin(ssh, FORWARD_REMOTE);
353 	} else {
354 		if ((options.allow_tcp_forwarding & FORWARD_LOCAL) == 0)
355 			channel_disable_admin(ssh, FORWARD_LOCAL);
356 		else
357 			channel_permit_all(ssh, FORWARD_LOCAL);
358 		if ((options.allow_tcp_forwarding & FORWARD_REMOTE) == 0)
359 			channel_disable_admin(ssh, FORWARD_REMOTE);
360 		else
361 			channel_permit_all(ssh, FORWARD_REMOTE);
362 	}
363 	auth_debug_send();
364 
365 	prepare_auth_info_file(authctxt->pw, authctxt->session_info);
366 
367 	do_authenticated2(ssh, authctxt);
368 
369 	do_cleanup(ssh, authctxt);
370 }
371 
372 /* Check untrusted xauth strings for metacharacters */
373 static int
374 xauth_valid_string(const char *s)
375 {
376 	size_t i;
377 
378 	for (i = 0; s[i] != '\0'; i++) {
379 		if (!isalnum((u_char)s[i]) &&
380 		    s[i] != '.' && s[i] != ':' && s[i] != '/' &&
381 		    s[i] != '-' && s[i] != '_')
382 			return 0;
383 	}
384 	return 1;
385 }
386 
387 #define USE_PIPES 1
388 /*
389  * This is called to fork and execute a command when we have no tty.  This
390  * will call do_child from the child, and server_loop from the parent after
391  * setting up file descriptors and such.
392  */
393 int
394 do_exec_no_pty(struct ssh *ssh, Session *s, const char *command)
395 {
396 	pid_t pid;
397 #ifdef USE_PIPES
398 	int pin[2], pout[2], perr[2];
399 
400 	if (s == NULL)
401 		fatal("do_exec_no_pty: no session");
402 
403 	/* Allocate pipes for communicating with the program. */
404 	if (pipe(pin) < 0) {
405 		error("%s: pipe in: %.100s", __func__, strerror(errno));
406 		return -1;
407 	}
408 	if (pipe(pout) < 0) {
409 		error("%s: pipe out: %.100s", __func__, strerror(errno));
410 		close(pin[0]);
411 		close(pin[1]);
412 		return -1;
413 	}
414 	if (pipe(perr) < 0) {
415 		error("%s: pipe err: %.100s", __func__,
416 		    strerror(errno));
417 		close(pin[0]);
418 		close(pin[1]);
419 		close(pout[0]);
420 		close(pout[1]);
421 		return -1;
422 	}
423 #else
424 	int inout[2], err[2];
425 
426 	if (s == NULL)
427 		fatal("do_exec_no_pty: no session");
428 
429 	/* Uses socket pairs to communicate with the program. */
430 	if (socketpair(AF_UNIX, SOCK_STREAM, 0, inout) < 0) {
431 		error("%s: socketpair #1: %.100s", __func__, strerror(errno));
432 		return -1;
433 	}
434 	if (socketpair(AF_UNIX, SOCK_STREAM, 0, err) < 0) {
435 		error("%s: socketpair #2: %.100s", __func__,
436 		    strerror(errno));
437 		close(inout[0]);
438 		close(inout[1]);
439 		return -1;
440 	}
441 #endif
442 
443 	session_proctitle(s);
444 
445 	/* Fork the child. */
446 	switch ((pid = fork())) {
447 	case -1:
448 		error("%s: fork: %.100s", __func__, strerror(errno));
449 #ifdef USE_PIPES
450 		close(pin[0]);
451 		close(pin[1]);
452 		close(pout[0]);
453 		close(pout[1]);
454 		close(perr[0]);
455 		close(perr[1]);
456 #else
457 		close(inout[0]);
458 		close(inout[1]);
459 		close(err[0]);
460 		close(err[1]);
461 #endif
462 		return -1;
463 	case 0:
464 		is_child = 1;
465 
466 		/*
467 		 * Create a new session and process group since the 4.4BSD
468 		 * setlogin() affects the entire process group.
469 		 */
470 		if (setsid() < 0)
471 			error("setsid failed: %.100s", strerror(errno));
472 
473 #ifdef USE_PIPES
474 		/*
475 		 * Redirect stdin.  We close the parent side of the socket
476 		 * pair, and make the child side the standard input.
477 		 */
478 		close(pin[1]);
479 		if (dup2(pin[0], 0) < 0)
480 			perror("dup2 stdin");
481 		close(pin[0]);
482 
483 		/* Redirect stdout. */
484 		close(pout[0]);
485 		if (dup2(pout[1], 1) < 0)
486 			perror("dup2 stdout");
487 		close(pout[1]);
488 
489 		/* Redirect stderr. */
490 		close(perr[0]);
491 		if (dup2(perr[1], 2) < 0)
492 			perror("dup2 stderr");
493 		close(perr[1]);
494 #else
495 		/*
496 		 * Redirect stdin, stdout, and stderr.  Stdin and stdout will
497 		 * use the same socket, as some programs (particularly rdist)
498 		 * seem to depend on it.
499 		 */
500 		close(inout[1]);
501 		close(err[1]);
502 		if (dup2(inout[0], 0) < 0)	/* stdin */
503 			perror("dup2 stdin");
504 		if (dup2(inout[0], 1) < 0)	/* stdout (same as stdin) */
505 			perror("dup2 stdout");
506 		close(inout[0]);
507 		if (dup2(err[0], 2) < 0)	/* stderr */
508 			perror("dup2 stderr");
509 		close(err[0]);
510 #endif
511 
512 		/* Do processing for the child (exec command etc). */
513 		do_child(ssh, s, command);
514 		/* NOTREACHED */
515 	default:
516 		break;
517 	}
518 
519 #ifdef HAVE_CYGWIN
520 	cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
521 #endif
522 
523 	s->pid = pid;
524 	/* Set interactive/non-interactive mode. */
525 	packet_set_interactive(s->display != NULL,
526 	    options.ip_qos_interactive, options.ip_qos_bulk);
527 
528 	/*
529 	 * Clear loginmsg, since it's the child's responsibility to display
530 	 * it to the user, otherwise multiple sessions may accumulate
531 	 * multiple copies of the login messages.
532 	 */
533 	sshbuf_reset(loginmsg);
534 
535 #ifdef USE_PIPES
536 	/* We are the parent.  Close the child sides of the pipes. */
537 	close(pin[0]);
538 	close(pout[1]);
539 	close(perr[1]);
540 
541 	session_set_fds(ssh, s, pin[1], pout[0], perr[0],
542 	    s->is_subsystem, 0);
543 #else
544 	/* We are the parent.  Close the child sides of the socket pairs. */
545 	close(inout[0]);
546 	close(err[0]);
547 
548 	/*
549 	 * Enter the interactive session.  Note: server_loop must be able to
550 	 * handle the case that fdin and fdout are the same.
551 	 */
552 	session_set_fds(s, inout[1], inout[1], err[1],
553 	    s->is_subsystem, 0);
554 #endif
555 	return 0;
556 }
557 
558 /*
559  * This is called to fork and execute a command when we have a tty.  This
560  * will call do_child from the child, and server_loop from the parent after
561  * setting up file descriptors, controlling tty, updating wtmp, utmp,
562  * lastlog, and other such operations.
563  */
564 int
565 do_exec_pty(struct ssh *ssh, Session *s, const char *command)
566 {
567 	int fdout, ptyfd, ttyfd, ptymaster;
568 	pid_t pid;
569 
570 	if (s == NULL)
571 		fatal("do_exec_pty: no session");
572 	ptyfd = s->ptyfd;
573 	ttyfd = s->ttyfd;
574 
575 	/*
576 	 * Create another descriptor of the pty master side for use as the
577 	 * standard input.  We could use the original descriptor, but this
578 	 * simplifies code in server_loop.  The descriptor is bidirectional.
579 	 * Do this before forking (and cleanup in the child) so as to
580 	 * detect and gracefully fail out-of-fd conditions.
581 	 */
582 	if ((fdout = dup(ptyfd)) < 0) {
583 		error("%s: dup #1: %s", __func__, strerror(errno));
584 		close(ttyfd);
585 		close(ptyfd);
586 		return -1;
587 	}
588 	/* we keep a reference to the pty master */
589 	if ((ptymaster = dup(ptyfd)) < 0) {
590 		error("%s: dup #2: %s", __func__, strerror(errno));
591 		close(ttyfd);
592 		close(ptyfd);
593 		close(fdout);
594 		return -1;
595 	}
596 
597 	/* Fork the child. */
598 	switch ((pid = fork())) {
599 	case -1:
600 		error("%s: fork: %.100s", __func__, strerror(errno));
601 		close(fdout);
602 		close(ptymaster);
603 		close(ttyfd);
604 		close(ptyfd);
605 		return -1;
606 	case 0:
607 		is_child = 1;
608 
609 		close(fdout);
610 		close(ptymaster);
611 
612 		/* Close the master side of the pseudo tty. */
613 		close(ptyfd);
614 
615 		/* Make the pseudo tty our controlling tty. */
616 		pty_make_controlling_tty(&ttyfd, s->tty);
617 
618 		/* Redirect stdin/stdout/stderr from the pseudo tty. */
619 		if (dup2(ttyfd, 0) < 0)
620 			error("dup2 stdin: %s", strerror(errno));
621 		if (dup2(ttyfd, 1) < 0)
622 			error("dup2 stdout: %s", strerror(errno));
623 		if (dup2(ttyfd, 2) < 0)
624 			error("dup2 stderr: %s", strerror(errno));
625 
626 		/* Close the extra descriptor for the pseudo tty. */
627 		close(ttyfd);
628 
629 		/* record login, etc. similar to login(1) */
630 #ifndef HAVE_OSF_SIA
631 		do_login(ssh, s, command);
632 #endif
633 		/*
634 		 * Do common processing for the child, such as execing
635 		 * the command.
636 		 */
637 		do_child(ssh, s, command);
638 		/* NOTREACHED */
639 	default:
640 		break;
641 	}
642 
643 #ifdef HAVE_CYGWIN
644 	cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
645 #endif
646 
647 	s->pid = pid;
648 
649 	/* Parent.  Close the slave side of the pseudo tty. */
650 	close(ttyfd);
651 
652 	/* Enter interactive session. */
653 	s->ptymaster = ptymaster;
654 	packet_set_interactive(1,
655 	    options.ip_qos_interactive, options.ip_qos_bulk);
656 	session_set_fds(ssh, s, ptyfd, fdout, -1, 1, 1);
657 	return 0;
658 }
659 
660 #ifdef LOGIN_NEEDS_UTMPX
661 static void
662 do_pre_login(Session *s)
663 {
664 	struct ssh *ssh = active_state;	/* XXX */
665 	socklen_t fromlen;
666 	struct sockaddr_storage from;
667 	pid_t pid = getpid();
668 
669 	/*
670 	 * Get IP address of client. If the connection is not a socket, let
671 	 * the address be 0.0.0.0.
672 	 */
673 	memset(&from, 0, sizeof(from));
674 	fromlen = sizeof(from);
675 	if (packet_connection_is_on_socket()) {
676 		if (getpeername(packet_get_connection_in(),
677 		    (struct sockaddr *)&from, &fromlen) < 0) {
678 			debug("getpeername: %.100s", strerror(errno));
679 			cleanup_exit(255);
680 		}
681 	}
682 
683 	record_utmp_only(pid, s->tty, s->pw->pw_name,
684 	    session_get_remote_name_or_ip(ssh, utmp_len, options.use_dns),
685 	    (struct sockaddr *)&from, fromlen);
686 }
687 #endif
688 
689 /*
690  * This is called to fork and execute a command.  If another command is
691  * to be forced, execute that instead.
692  */
693 int
694 do_exec(struct ssh *ssh, Session *s, const char *command)
695 {
696 	int ret;
697 	const char *forced = NULL, *tty = NULL;
698 	char session_type[1024];
699 
700 	if (options.adm_forced_command) {
701 		original_command = command;
702 		command = options.adm_forced_command;
703 		forced = "(config)";
704 	} else if (auth_opts->force_command != NULL) {
705 		original_command = command;
706 		command = auth_opts->force_command;
707 		forced = "(key-option)";
708 	}
709 	s->forced = 0;
710 	if (forced != NULL) {
711 		s->forced = 1;
712 		if (IS_INTERNAL_SFTP(command)) {
713 			s->is_subsystem = s->is_subsystem ?
714 			    SUBSYSTEM_INT_SFTP : SUBSYSTEM_INT_SFTP_ERROR;
715 		} else if (s->is_subsystem)
716 			s->is_subsystem = SUBSYSTEM_EXT;
717 		snprintf(session_type, sizeof(session_type),
718 		    "forced-command %s '%.900s'", forced, command);
719 	} else if (s->is_subsystem) {
720 		snprintf(session_type, sizeof(session_type),
721 		    "subsystem '%.900s'", s->subsys);
722 	} else if (command == NULL) {
723 		snprintf(session_type, sizeof(session_type), "shell");
724 	} else {
725 		/* NB. we don't log unforced commands to preserve privacy */
726 		snprintf(session_type, sizeof(session_type), "command");
727 	}
728 
729 	if (s->ttyfd != -1) {
730 		tty = s->tty;
731 		if (strncmp(tty, "/dev/", 5) == 0)
732 			tty += 5;
733 	}
734 
735 	verbose("Starting session: %s%s%s for %s from %.200s port %d id %d",
736 	    session_type,
737 	    tty == NULL ? "" : " on ",
738 	    tty == NULL ? "" : tty,
739 	    s->pw->pw_name,
740 	    ssh_remote_ipaddr(ssh),
741 	    ssh_remote_port(ssh),
742 	    s->self);
743 
744 #ifdef SSH_AUDIT_EVENTS
745 	if (command != NULL)
746 		PRIVSEP(audit_run_command(command));
747 	else if (s->ttyfd == -1) {
748 		char *shell = s->pw->pw_shell;
749 
750 		if (shell[0] == '\0')	/* empty shell means /bin/sh */
751 			shell =_PATH_BSHELL;
752 		PRIVSEP(audit_run_command(shell));
753 	}
754 #endif
755 	if (s->ttyfd != -1)
756 		ret = do_exec_pty(ssh, s, command);
757 	else
758 		ret = do_exec_no_pty(ssh, s, command);
759 
760 	original_command = NULL;
761 
762 	/*
763 	 * Clear loginmsg: it's the child's responsibility to display
764 	 * it to the user, otherwise multiple sessions may accumulate
765 	 * multiple copies of the login messages.
766 	 */
767 	sshbuf_reset(loginmsg);
768 
769 	return ret;
770 }
771 
772 /* administrative, login(1)-like work */
773 void
774 do_login(struct ssh *ssh, Session *s, const char *command)
775 {
776 	socklen_t fromlen;
777 	struct sockaddr_storage from;
778 	struct passwd * pw = s->pw;
779 	pid_t pid = getpid();
780 
781 	/*
782 	 * Get IP address of client. If the connection is not a socket, let
783 	 * the address be 0.0.0.0.
784 	 */
785 	memset(&from, 0, sizeof(from));
786 	fromlen = sizeof(from);
787 	if (packet_connection_is_on_socket()) {
788 		if (getpeername(packet_get_connection_in(),
789 		    (struct sockaddr *)&from, &fromlen) < 0) {
790 			debug("getpeername: %.100s", strerror(errno));
791 			cleanup_exit(255);
792 		}
793 	}
794 
795 	/* Record that there was a login on that tty from the remote host. */
796 	if (!use_privsep)
797 		record_login(pid, s->tty, pw->pw_name, pw->pw_uid,
798 		    session_get_remote_name_or_ip(ssh, utmp_len,
799 		    options.use_dns),
800 		    (struct sockaddr *)&from, fromlen);
801 
802 #ifdef USE_PAM
803 	/*
804 	 * If password change is needed, do it now.
805 	 * This needs to occur before the ~/.hushlogin check.
806 	 */
807 	if (options.use_pam && !use_privsep && s->authctxt->force_pwchange) {
808 		display_loginmsg();
809 		do_pam_chauthtok();
810 		s->authctxt->force_pwchange = 0;
811 		/* XXX - signal [net] parent to enable forwardings */
812 	}
813 #endif
814 
815 	if (check_quietlogin(s, command))
816 		return;
817 
818 	display_loginmsg();
819 
820 	do_motd();
821 }
822 
823 /*
824  * Display the message of the day.
825  */
826 void
827 do_motd(void)
828 {
829 	FILE *f;
830 	char buf[256];
831 
832 	if (options.print_motd) {
833 #ifdef HAVE_LOGIN_CAP
834 		f = fopen(login_getcapstr(lc, "welcome", "/etc/motd",
835 		    "/etc/motd"), "r");
836 #else
837 		f = fopen("/etc/motd", "r");
838 #endif
839 		if (f) {
840 			while (fgets(buf, sizeof(buf), f))
841 				fputs(buf, stdout);
842 			fclose(f);
843 		}
844 	}
845 }
846 
847 
848 /*
849  * Check for quiet login, either .hushlogin or command given.
850  */
851 int
852 check_quietlogin(Session *s, const char *command)
853 {
854 	char buf[256];
855 	struct passwd *pw = s->pw;
856 	struct stat st;
857 
858 	/* Return 1 if .hushlogin exists or a command given. */
859 	if (command != NULL)
860 		return 1;
861 	snprintf(buf, sizeof(buf), "%.200s/.hushlogin", pw->pw_dir);
862 #ifdef HAVE_LOGIN_CAP
863 	if (login_getcapbool(lc, "hushlogin", 0) || stat(buf, &st) >= 0)
864 		return 1;
865 #else
866 	if (stat(buf, &st) >= 0)
867 		return 1;
868 #endif
869 	return 0;
870 }
871 
872 /*
873  * Reads environment variables from the given file and adds/overrides them
874  * into the environment.  If the file does not exist, this does nothing.
875  * Otherwise, it must consist of empty lines, comments (line starts with '#')
876  * and assignments of the form name=value.  No other forms are allowed.
877  * If whitelist is not NULL, then it is interpreted as a pattern list and
878  * only variable names that match it will be accepted.
879  */
880 static void
881 read_environment_file(char ***env, u_int *envsize,
882 	const char *filename, const char *whitelist)
883 {
884 	FILE *f;
885 	char *line = NULL, *cp, *value;
886 	size_t linesize = 0;
887 	u_int lineno = 0;
888 
889 	f = fopen(filename, "r");
890 	if (!f)
891 		return;
892 
893 	while (getline(&line, &linesize, f) != -1) {
894 		if (++lineno > 1000)
895 			fatal("Too many lines in environment file %s", filename);
896 		for (cp = line; *cp == ' ' || *cp == '\t'; cp++)
897 			;
898 		if (!*cp || *cp == '#' || *cp == '\n')
899 			continue;
900 
901 		cp[strcspn(cp, "\n")] = '\0';
902 
903 		value = strchr(cp, '=');
904 		if (value == NULL) {
905 			fprintf(stderr, "Bad line %u in %.100s\n", lineno,
906 			    filename);
907 			continue;
908 		}
909 		/*
910 		 * Replace the equals sign by nul, and advance value to
911 		 * the value string.
912 		 */
913 		*value = '\0';
914 		value++;
915 		if (whitelist != NULL &&
916 		    match_pattern_list(cp, whitelist, 0) != 1)
917 			continue;
918 		child_set_env(env, envsize, cp, value);
919 	}
920 	free(line);
921 	fclose(f);
922 }
923 
924 #ifdef HAVE_ETC_DEFAULT_LOGIN
925 /*
926  * Return named variable from specified environment, or NULL if not present.
927  */
928 static char *
929 child_get_env(char **env, const char *name)
930 {
931 	int i;
932 	size_t len;
933 
934 	len = strlen(name);
935 	for (i=0; env[i] != NULL; i++)
936 		if (strncmp(name, env[i], len) == 0 && env[i][len] == '=')
937 			return(env[i] + len + 1);
938 	return NULL;
939 }
940 
941 /*
942  * Read /etc/default/login.
943  * We pick up the PATH (or SUPATH for root) and UMASK.
944  */
945 static void
946 read_etc_default_login(char ***env, u_int *envsize, uid_t uid)
947 {
948 	char **tmpenv = NULL, *var;
949 	u_int i, tmpenvsize = 0;
950 	u_long mask;
951 
952 	/*
953 	 * We don't want to copy the whole file to the child's environment,
954 	 * so we use a temporary environment and copy the variables we're
955 	 * interested in.
956 	 */
957 	read_environment_file(&tmpenv, &tmpenvsize, "/etc/default/login",
958 	    options.permit_user_env_whitelist);
959 
960 	if (tmpenv == NULL)
961 		return;
962 
963 	if (uid == 0)
964 		var = child_get_env(tmpenv, "SUPATH");
965 	else
966 		var = child_get_env(tmpenv, "PATH");
967 	if (var != NULL)
968 		child_set_env(env, envsize, "PATH", var);
969 
970 	if ((var = child_get_env(tmpenv, "UMASK")) != NULL)
971 		if (sscanf(var, "%5lo", &mask) == 1)
972 			umask((mode_t)mask);
973 
974 	for (i = 0; tmpenv[i] != NULL; i++)
975 		free(tmpenv[i]);
976 	free(tmpenv);
977 }
978 #endif /* HAVE_ETC_DEFAULT_LOGIN */
979 
980 static void
981 copy_environment_blacklist(char **source, char ***env, u_int *envsize,
982     const char *blacklist)
983 {
984 	char *var_name, *var_val;
985 	int i;
986 
987 	if (source == NULL)
988 		return;
989 
990 	for(i = 0; source[i] != NULL; i++) {
991 		var_name = xstrdup(source[i]);
992 		if ((var_val = strstr(var_name, "=")) == NULL) {
993 			free(var_name);
994 			continue;
995 		}
996 		*var_val++ = '\0';
997 
998 		if (blacklist == NULL ||
999 		    match_pattern_list(var_name, blacklist, 0) != 1) {
1000 			debug3("Copy environment: %s=%s", var_name, var_val);
1001 			child_set_env(env, envsize, var_name, var_val);
1002 		}
1003 
1004 		free(var_name);
1005 	}
1006 }
1007 
1008 void
1009 copy_environment(char **source, char ***env, u_int *envsize)
1010 {
1011 	copy_environment_blacklist(source, env, envsize, NULL);
1012 }
1013 
1014 static char **
1015 do_setup_env(struct ssh *ssh, Session *s, const char *shell)
1016 {
1017 	char buf[256];
1018 	size_t n;
1019 	u_int i, envsize;
1020 	char *ocp, *cp, *value, **env, *laddr;
1021 	struct passwd *pw = s->pw;
1022 #if !defined (HAVE_LOGIN_CAP) && !defined (HAVE_CYGWIN)
1023 	char *path = NULL;
1024 #else
1025 	extern char **environ;
1026 	char **senv, **var, *val;
1027 #endif
1028 
1029 	/* Initialize the environment. */
1030 	envsize = 100;
1031 	env = xcalloc(envsize, sizeof(char *));
1032 	env[0] = NULL;
1033 
1034 #ifdef HAVE_CYGWIN
1035 	/*
1036 	 * The Windows environment contains some setting which are
1037 	 * important for a running system. They must not be dropped.
1038 	 */
1039 	{
1040 		char **p;
1041 
1042 		p = fetch_windows_environment();
1043 		copy_environment(p, &env, &envsize);
1044 		free_windows_environment(p);
1045 	}
1046 #endif
1047 
1048 	if (getenv("TZ"))
1049 		child_set_env(&env, &envsize, "TZ", getenv("TZ"));
1050 
1051 #ifdef GSSAPI
1052 	/* Allow any GSSAPI methods that we've used to alter
1053 	 * the childs environment as they see fit
1054 	 */
1055 	ssh_gssapi_do_child(&env, &envsize);
1056 #endif
1057 
1058 	/* Set basic environment. */
1059 	for (i = 0; i < s->num_env; i++)
1060 		child_set_env(&env, &envsize, s->env[i].name, s->env[i].val);
1061 
1062 	child_set_env(&env, &envsize, "USER", pw->pw_name);
1063 	child_set_env(&env, &envsize, "LOGNAME", pw->pw_name);
1064 #ifdef _AIX
1065 	child_set_env(&env, &envsize, "LOGIN", pw->pw_name);
1066 #endif
1067 	child_set_env(&env, &envsize, "HOME", pw->pw_dir);
1068 	snprintf(buf, sizeof buf, "%.200s/%.50s", _PATH_MAILDIR, pw->pw_name);
1069 	child_set_env(&env, &envsize, "MAIL", buf);
1070 #ifdef HAVE_LOGIN_CAP
1071 	child_set_env(&env, &envsize, "PATH", _PATH_STDPATH);
1072 	child_set_env(&env, &envsize, "TERM", "su");
1073 	/*
1074 	 * Temporarily swap out our real environment with an empty one,
1075 	 * let setusercontext() apply any environment variables defined
1076 	 * for the user's login class, copy those variables to the child,
1077 	 * free the temporary environment, and restore the original.
1078 	 */
1079 	senv = environ;
1080 	environ = xmalloc(sizeof(*environ));
1081 	*environ = NULL;
1082 	(void)setusercontext(lc, pw, pw->pw_uid, LOGIN_SETENV|LOGIN_SETPATH);
1083 	for (var = environ; *var != NULL; ++var) {
1084 		if ((val = strchr(*var, '=')) != NULL) {
1085 			*val++ = '\0';
1086 			child_set_env(&env, &envsize, *var, val);
1087 		}
1088 		free(*var);
1089 	}
1090 	free(environ);
1091 	environ = senv;
1092 #else /* HAVE_LOGIN_CAP */
1093 # ifndef HAVE_CYGWIN
1094 	/*
1095 	 * There's no standard path on Windows. The path contains
1096 	 * important components pointing to the system directories,
1097 	 * needed for loading shared libraries. So the path better
1098 	 * remains intact here.
1099 	 */
1100 #  ifdef HAVE_ETC_DEFAULT_LOGIN
1101 	read_etc_default_login(&env, &envsize, pw->pw_uid);
1102 	path = child_get_env(env, "PATH");
1103 #  endif /* HAVE_ETC_DEFAULT_LOGIN */
1104 	if (path == NULL || *path == '\0') {
1105 		child_set_env(&env, &envsize, "PATH",
1106 		    s->pw->pw_uid == 0 ?  SUPERUSER_PATH : _PATH_STDPATH);
1107 	}
1108 # endif /* HAVE_CYGWIN */
1109 #endif /* HAVE_LOGIN_CAP */
1110 
1111 	/* Normal systems set SHELL by default. */
1112 	child_set_env(&env, &envsize, "SHELL", shell);
1113 
1114 	if (s->term)
1115 		child_set_env(&env, &envsize, "TERM", s->term);
1116 	if (s->display)
1117 		child_set_env(&env, &envsize, "DISPLAY", s->display);
1118 
1119 	/*
1120 	 * Since we clear KRB5CCNAME at startup, if it's set now then it
1121 	 * must have been set by a native authentication method (eg AIX or
1122 	 * SIA), so copy it to the child.
1123 	 */
1124 	{
1125 		char *cp;
1126 
1127 		if ((cp = getenv("KRB5CCNAME")) != NULL)
1128 			child_set_env(&env, &envsize, "KRB5CCNAME", cp);
1129 	}
1130 
1131 #ifdef _AIX
1132 	{
1133 		char *cp;
1134 
1135 		if ((cp = getenv("AUTHSTATE")) != NULL)
1136 			child_set_env(&env, &envsize, "AUTHSTATE", cp);
1137 		read_environment_file(&env, &envsize, "/etc/environment",
1138 		    options.permit_user_env_whitelist);
1139 	}
1140 #endif
1141 #ifdef KRB5
1142 	if (s->authctxt->krb5_ccname)
1143 		child_set_env(&env, &envsize, "KRB5CCNAME",
1144 		    s->authctxt->krb5_ccname);
1145 #endif
1146 	if (auth_sock_name != NULL)
1147 		child_set_env(&env, &envsize, SSH_AUTHSOCKET_ENV_NAME,
1148 		    auth_sock_name);
1149 
1150 
1151 	/* Set custom environment options from pubkey authentication. */
1152 	if (options.permit_user_env) {
1153 		for (n = 0 ; n < auth_opts->nenv; n++) {
1154 			ocp = xstrdup(auth_opts->env[n]);
1155 			cp = strchr(ocp, '=');
1156 			if (*cp == '=') {
1157 				*cp = '\0';
1158 				/* Apply PermitUserEnvironment whitelist */
1159 				if (options.permit_user_env_whitelist == NULL ||
1160 				    match_pattern_list(ocp,
1161 				    options.permit_user_env_whitelist, 0) == 1)
1162 					child_set_env(&env, &envsize,
1163 					    ocp, cp + 1);
1164 			}
1165 			free(ocp);
1166 		}
1167 	}
1168 
1169 	/* read $HOME/.ssh/environment. */
1170 	if (options.permit_user_env) {
1171 		snprintf(buf, sizeof buf, "%.200s/.ssh/environment",
1172 		    pw->pw_dir);
1173 		read_environment_file(&env, &envsize, buf,
1174 		    options.permit_user_env_whitelist);
1175 	}
1176 
1177 #ifdef USE_PAM
1178 	/*
1179 	 * Pull in any environment variables that may have
1180 	 * been set by PAM.
1181 	 */
1182 	if (options.use_pam) {
1183 		char **p;
1184 
1185 		/*
1186 		 * Don't allow SSH_AUTH_INFO variables posted to PAM to leak
1187 		 * back into the environment.
1188 		 */
1189 		p = fetch_pam_child_environment();
1190 		copy_environment_blacklist(p, &env, &envsize, "SSH_AUTH_INFO*");
1191 		free_pam_environment(p);
1192 
1193 		p = fetch_pam_environment();
1194 		copy_environment_blacklist(p, &env, &envsize, "SSH_AUTH_INFO*");
1195 		free_pam_environment(p);
1196 	}
1197 #endif /* USE_PAM */
1198 
1199 	/* Environment specified by admin */
1200 	for (i = 0; i < options.num_setenv; i++) {
1201 		cp = xstrdup(options.setenv[i]);
1202 		if ((value = strchr(cp, '=')) == NULL) {
1203 			/* shouldn't happen; vars are checked in servconf.c */
1204 			fatal("Invalid config SetEnv: %s", options.setenv[i]);
1205 		}
1206 		*value++ = '\0';
1207 		child_set_env(&env, &envsize, cp, value);
1208 	}
1209 
1210 	/* SSH_CLIENT deprecated */
1211 	snprintf(buf, sizeof buf, "%.50s %d %d",
1212 	    ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
1213 	    ssh_local_port(ssh));
1214 	child_set_env(&env, &envsize, "SSH_CLIENT", buf);
1215 
1216 	laddr = get_local_ipaddr(packet_get_connection_in());
1217 	snprintf(buf, sizeof buf, "%.50s %d %.50s %d",
1218 	    ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
1219 	    laddr, ssh_local_port(ssh));
1220 	free(laddr);
1221 	child_set_env(&env, &envsize, "SSH_CONNECTION", buf);
1222 
1223 	if (tun_fwd_ifnames != NULL)
1224 		child_set_env(&env, &envsize, "SSH_TUNNEL", tun_fwd_ifnames);
1225 	if (auth_info_file != NULL)
1226 		child_set_env(&env, &envsize, "SSH_USER_AUTH", auth_info_file);
1227 	if (s->ttyfd != -1)
1228 		child_set_env(&env, &envsize, "SSH_TTY", s->tty);
1229 	if (original_command)
1230 		child_set_env(&env, &envsize, "SSH_ORIGINAL_COMMAND",
1231 		    original_command);
1232 
1233 	if (debug_flag) {
1234 		/* dump the environment */
1235 		fprintf(stderr, "Environment:\n");
1236 		for (i = 0; env[i]; i++)
1237 			fprintf(stderr, "  %.200s\n", env[i]);
1238 	}
1239 	return env;
1240 }
1241 
1242 /*
1243  * Run $HOME/.ssh/rc, /etc/ssh/sshrc, or xauth (whichever is found
1244  * first in this order).
1245  */
1246 static void
1247 do_rc_files(struct ssh *ssh, Session *s, const char *shell)
1248 {
1249 	FILE *f = NULL;
1250 	char cmd[1024];
1251 	int do_xauth;
1252 	struct stat st;
1253 
1254 	do_xauth =
1255 	    s->display != NULL && s->auth_proto != NULL && s->auth_data != NULL;
1256 
1257 	/* ignore _PATH_SSH_USER_RC for subsystems and admin forced commands */
1258 	if (!s->is_subsystem && options.adm_forced_command == NULL &&
1259 	    auth_opts->permit_user_rc && options.permit_user_rc &&
1260 	    stat(_PATH_SSH_USER_RC, &st) >= 0) {
1261 		snprintf(cmd, sizeof cmd, "%s -c '%s %s'",
1262 		    shell, _PATH_BSHELL, _PATH_SSH_USER_RC);
1263 		if (debug_flag)
1264 			fprintf(stderr, "Running %s\n", cmd);
1265 		f = popen(cmd, "w");
1266 		if (f) {
1267 			if (do_xauth)
1268 				fprintf(f, "%s %s\n", s->auth_proto,
1269 				    s->auth_data);
1270 			pclose(f);
1271 		} else
1272 			fprintf(stderr, "Could not run %s\n",
1273 			    _PATH_SSH_USER_RC);
1274 	} else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) {
1275 		if (debug_flag)
1276 			fprintf(stderr, "Running %s %s\n", _PATH_BSHELL,
1277 			    _PATH_SSH_SYSTEM_RC);
1278 		f = popen(_PATH_BSHELL " " _PATH_SSH_SYSTEM_RC, "w");
1279 		if (f) {
1280 			if (do_xauth)
1281 				fprintf(f, "%s %s\n", s->auth_proto,
1282 				    s->auth_data);
1283 			pclose(f);
1284 		} else
1285 			fprintf(stderr, "Could not run %s\n",
1286 			    _PATH_SSH_SYSTEM_RC);
1287 	} else if (do_xauth && options.xauth_location != NULL) {
1288 		/* Add authority data to .Xauthority if appropriate. */
1289 		if (debug_flag) {
1290 			fprintf(stderr,
1291 			    "Running %.500s remove %.100s\n",
1292 			    options.xauth_location, s->auth_display);
1293 			fprintf(stderr,
1294 			    "%.500s add %.100s %.100s %.100s\n",
1295 			    options.xauth_location, s->auth_display,
1296 			    s->auth_proto, s->auth_data);
1297 		}
1298 		snprintf(cmd, sizeof cmd, "%s -q -",
1299 		    options.xauth_location);
1300 		f = popen(cmd, "w");
1301 		if (f) {
1302 			fprintf(f, "remove %s\n",
1303 			    s->auth_display);
1304 			fprintf(f, "add %s %s %s\n",
1305 			    s->auth_display, s->auth_proto,
1306 			    s->auth_data);
1307 			pclose(f);
1308 		} else {
1309 			fprintf(stderr, "Could not run %s\n",
1310 			    cmd);
1311 		}
1312 	}
1313 }
1314 
1315 static void
1316 do_nologin(struct passwd *pw)
1317 {
1318 	FILE *f = NULL;
1319 	const char *nl;
1320 	char buf[1024], *def_nl = _PATH_NOLOGIN;
1321 	struct stat sb;
1322 
1323 #ifdef HAVE_LOGIN_CAP
1324 	if (login_getcapbool(lc, "ignorenologin", 0) || pw->pw_uid == 0)
1325 		return;
1326 	nl = login_getcapstr(lc, "nologin", def_nl, def_nl);
1327 #else
1328 	if (pw->pw_uid == 0)
1329 		return;
1330 	nl = def_nl;
1331 #endif
1332 	if (stat(nl, &sb) == -1)
1333 		return;
1334 
1335 	/* /etc/nologin exists.  Print its contents if we can and exit. */
1336 	logit("User %.100s not allowed because %s exists", pw->pw_name, nl);
1337 	if ((f = fopen(nl, "r")) != NULL) {
1338 		while (fgets(buf, sizeof(buf), f))
1339 			fputs(buf, stderr);
1340 		fclose(f);
1341 	}
1342 	exit(254);
1343 }
1344 
1345 /*
1346  * Chroot into a directory after checking it for safety: all path components
1347  * must be root-owned directories with strict permissions.
1348  */
1349 static void
1350 safely_chroot(const char *path, uid_t uid)
1351 {
1352 	const char *cp;
1353 	char component[PATH_MAX];
1354 	struct stat st;
1355 
1356 	if (*path != '/')
1357 		fatal("chroot path does not begin at root");
1358 	if (strlen(path) >= sizeof(component))
1359 		fatal("chroot path too long");
1360 
1361 	/*
1362 	 * Descend the path, checking that each component is a
1363 	 * root-owned directory with strict permissions.
1364 	 */
1365 	for (cp = path; cp != NULL;) {
1366 		if ((cp = strchr(cp, '/')) == NULL)
1367 			strlcpy(component, path, sizeof(component));
1368 		else {
1369 			cp++;
1370 			memcpy(component, path, cp - path);
1371 			component[cp - path] = '\0';
1372 		}
1373 
1374 		debug3("%s: checking '%s'", __func__, component);
1375 
1376 		if (stat(component, &st) != 0)
1377 			fatal("%s: stat(\"%s\"): %s", __func__,
1378 			    component, strerror(errno));
1379 		if (st.st_uid != 0 || (st.st_mode & 022) != 0)
1380 			fatal("bad ownership or modes for chroot "
1381 			    "directory %s\"%s\"",
1382 			    cp == NULL ? "" : "component ", component);
1383 		if (!S_ISDIR(st.st_mode))
1384 			fatal("chroot path %s\"%s\" is not a directory",
1385 			    cp == NULL ? "" : "component ", component);
1386 
1387 	}
1388 
1389 	if (chdir(path) == -1)
1390 		fatal("Unable to chdir to chroot path \"%s\": "
1391 		    "%s", path, strerror(errno));
1392 	if (chroot(path) == -1)
1393 		fatal("chroot(\"%s\"): %s", path, strerror(errno));
1394 	if (chdir("/") == -1)
1395 		fatal("%s: chdir(/) after chroot: %s",
1396 		    __func__, strerror(errno));
1397 	verbose("Changed root directory to \"%s\"", path);
1398 }
1399 
1400 /* Set login name, uid, gid, and groups. */
1401 void
1402 do_setusercontext(struct passwd *pw)
1403 {
1404 	char uidstr[32], *chroot_path, *tmp;
1405 
1406 	platform_setusercontext(pw);
1407 
1408 	if (platform_privileged_uidswap()) {
1409 #ifdef HAVE_LOGIN_CAP
1410 		if (setusercontext(lc, pw, pw->pw_uid,
1411 		    (LOGIN_SETALL & ~(LOGIN_SETENV|LOGIN_SETPATH|LOGIN_SETUSER))) < 0) {
1412 			perror("unable to set user context");
1413 			exit(1);
1414 		}
1415 #else
1416 		if (setlogin(pw->pw_name) < 0)
1417 			error("setlogin failed: %s", strerror(errno));
1418 		if (setgid(pw->pw_gid) < 0) {
1419 			perror("setgid");
1420 			exit(1);
1421 		}
1422 		/* Initialize the group list. */
1423 		if (initgroups(pw->pw_name, pw->pw_gid) < 0) {
1424 			perror("initgroups");
1425 			exit(1);
1426 		}
1427 		endgrent();
1428 #endif
1429 
1430 		platform_setusercontext_post_groups(pw);
1431 
1432 		if (!in_chroot && options.chroot_directory != NULL &&
1433 		    strcasecmp(options.chroot_directory, "none") != 0) {
1434                         tmp = tilde_expand_filename(options.chroot_directory,
1435 			    pw->pw_uid);
1436 			snprintf(uidstr, sizeof(uidstr), "%llu",
1437 			    (unsigned long long)pw->pw_uid);
1438 			chroot_path = percent_expand(tmp, "h", pw->pw_dir,
1439 			    "u", pw->pw_name, "U", uidstr, (char *)NULL);
1440 			safely_chroot(chroot_path, pw->pw_uid);
1441 			free(tmp);
1442 			free(chroot_path);
1443 			/* Make sure we don't attempt to chroot again */
1444 			free(options.chroot_directory);
1445 			options.chroot_directory = NULL;
1446 			in_chroot = 1;
1447 		}
1448 
1449 #ifdef HAVE_LOGIN_CAP
1450 		if (setusercontext(lc, pw, pw->pw_uid, LOGIN_SETUSER) < 0) {
1451 			perror("unable to set user context (setuser)");
1452 			exit(1);
1453 		}
1454 		/*
1455 		 * FreeBSD's setusercontext() will not apply the user's
1456 		 * own umask setting unless running with the user's UID.
1457 		 */
1458 		(void) setusercontext(lc, pw, pw->pw_uid, LOGIN_SETUMASK);
1459 #else
1460 # ifdef USE_LIBIAF
1461 		/*
1462 		 * In a chroot environment, the set_id() will always fail;
1463 		 * typically because of the lack of necessary authentication
1464 		 * services and runtime such as ./usr/lib/libiaf.so,
1465 		 * ./usr/lib/libpam.so.1, and ./etc/passwd We skip it in the
1466 		 * internal sftp chroot case.  We'll lose auditing and ACLs but
1467 		 * permanently_set_uid will take care of the rest.
1468 		 */
1469 		if (!in_chroot && set_id(pw->pw_name) != 0)
1470 			fatal("set_id(%s) Failed", pw->pw_name);
1471 # endif /* USE_LIBIAF */
1472 		/* Permanently switch to the desired uid. */
1473 		permanently_set_uid(pw);
1474 #endif
1475 	} else if (options.chroot_directory != NULL &&
1476 	    strcasecmp(options.chroot_directory, "none") != 0) {
1477 		fatal("server lacks privileges to chroot to ChrootDirectory");
1478 	}
1479 
1480 	if (getuid() != pw->pw_uid || geteuid() != pw->pw_uid)
1481 		fatal("Failed to set uids to %u.", (u_int) pw->pw_uid);
1482 }
1483 
1484 static void
1485 do_pwchange(Session *s)
1486 {
1487 	fflush(NULL);
1488 	fprintf(stderr, "WARNING: Your password has expired.\n");
1489 	if (s->ttyfd != -1) {
1490 		fprintf(stderr,
1491 		    "You must change your password now and login again!\n");
1492 #ifdef WITH_SELINUX
1493 		setexeccon(NULL);
1494 #endif
1495 #ifdef PASSWD_NEEDS_USERNAME
1496 		execl(_PATH_PASSWD_PROG, "passwd", s->pw->pw_name,
1497 		    (char *)NULL);
1498 #else
1499 		execl(_PATH_PASSWD_PROG, "passwd", (char *)NULL);
1500 #endif
1501 		perror("passwd");
1502 	} else {
1503 		fprintf(stderr,
1504 		    "Password change required but no TTY available.\n");
1505 	}
1506 	exit(1);
1507 }
1508 
1509 static void
1510 child_close_fds(struct ssh *ssh)
1511 {
1512 	extern int auth_sock;
1513 
1514 	if (auth_sock != -1) {
1515 		close(auth_sock);
1516 		auth_sock = -1;
1517 	}
1518 
1519 	if (packet_get_connection_in() == packet_get_connection_out())
1520 		close(packet_get_connection_in());
1521 	else {
1522 		close(packet_get_connection_in());
1523 		close(packet_get_connection_out());
1524 	}
1525 	/*
1526 	 * Close all descriptors related to channels.  They will still remain
1527 	 * open in the parent.
1528 	 */
1529 	/* XXX better use close-on-exec? -markus */
1530 	channel_close_all(ssh);
1531 
1532 	/*
1533 	 * Close any extra file descriptors.  Note that there may still be
1534 	 * descriptors left by system functions.  They will be closed later.
1535 	 */
1536 	endpwent();
1537 
1538 	/*
1539 	 * Close any extra open file descriptors so that we don't have them
1540 	 * hanging around in clients.  Note that we want to do this after
1541 	 * initgroups, because at least on Solaris 2.3 it leaves file
1542 	 * descriptors open.
1543 	 */
1544 	closefrom(STDERR_FILENO + 1);
1545 }
1546 
1547 /*
1548  * Performs common processing for the child, such as setting up the
1549  * environment, closing extra file descriptors, setting the user and group
1550  * ids, and executing the command or shell.
1551  */
1552 #define ARGV_MAX 10
1553 void
1554 do_child(struct ssh *ssh, Session *s, const char *command)
1555 {
1556 	extern char **environ;
1557 	char **env;
1558 	char *argv[ARGV_MAX];
1559 	const char *shell, *shell0;
1560 	struct passwd *pw = s->pw;
1561 	int r = 0;
1562 
1563 	/* remove hostkey from the child's memory */
1564 	destroy_sensitive_data();
1565 	packet_clear_keys();
1566 
1567 	/* Force a password change */
1568 	if (s->authctxt->force_pwchange) {
1569 		do_setusercontext(pw);
1570 		child_close_fds(ssh);
1571 		do_pwchange(s);
1572 		exit(1);
1573 	}
1574 
1575 	/*
1576 	 * Login(1) does this as well, and it needs uid 0 for the "-h"
1577 	 * switch, so we let login(1) to this for us.
1578 	 */
1579 #ifdef HAVE_OSF_SIA
1580 	session_setup_sia(pw, s->ttyfd == -1 ? NULL : s->tty);
1581 	if (!check_quietlogin(s, command))
1582 		do_motd();
1583 #else /* HAVE_OSF_SIA */
1584 	/* When PAM is enabled we rely on it to do the nologin check */
1585 	if (!options.use_pam)
1586 		do_nologin(pw);
1587 	do_setusercontext(pw);
1588 	/*
1589 	 * PAM session modules in do_setusercontext may have
1590 	 * generated messages, so if this in an interactive
1591 	 * login then display them too.
1592 	 */
1593 	if (!check_quietlogin(s, command))
1594 		display_loginmsg();
1595 #endif /* HAVE_OSF_SIA */
1596 
1597 #ifdef USE_PAM
1598 	if (options.use_pam && !is_pam_session_open()) {
1599 		debug3("PAM session not opened, exiting");
1600 		display_loginmsg();
1601 		exit(254);
1602 	}
1603 #endif
1604 
1605 	/*
1606 	 * Get the shell from the password data.  An empty shell field is
1607 	 * legal, and means /bin/sh.
1608 	 */
1609 	shell = (pw->pw_shell[0] == '\0') ? _PATH_BSHELL : pw->pw_shell;
1610 
1611 	/*
1612 	 * Make sure $SHELL points to the shell from the password file,
1613 	 * even if shell is overridden from login.conf
1614 	 */
1615 	env = do_setup_env(ssh, s, shell);
1616 
1617 #ifdef HAVE_LOGIN_CAP
1618 	shell = login_getcapstr(lc, "shell", (char *)shell, (char *)shell);
1619 #endif
1620 
1621 	/*
1622 	 * Close the connection descriptors; note that this is the child, and
1623 	 * the server will still have the socket open, and it is important
1624 	 * that we do not shutdown it.  Note that the descriptors cannot be
1625 	 * closed before building the environment, as we call
1626 	 * ssh_remote_ipaddr there.
1627 	 */
1628 	child_close_fds(ssh);
1629 
1630 	/*
1631 	 * Must take new environment into use so that .ssh/rc,
1632 	 * /etc/ssh/sshrc and xauth are run in the proper environment.
1633 	 */
1634 	environ = env;
1635 
1636 #if defined(KRB5) && defined(USE_AFS)
1637 	/*
1638 	 * At this point, we check to see if AFS is active and if we have
1639 	 * a valid Kerberos 5 TGT. If so, it seems like a good idea to see
1640 	 * if we can (and need to) extend the ticket into an AFS token. If
1641 	 * we don't do this, we run into potential problems if the user's
1642 	 * home directory is in AFS and it's not world-readable.
1643 	 */
1644 
1645 	if (options.kerberos_get_afs_token && k_hasafs() &&
1646 	    (s->authctxt->krb5_ctx != NULL)) {
1647 		char cell[64];
1648 
1649 		debug("Getting AFS token");
1650 
1651 		k_setpag();
1652 
1653 		if (k_afs_cell_of_file(pw->pw_dir, cell, sizeof(cell)) == 0)
1654 			krb5_afslog(s->authctxt->krb5_ctx,
1655 			    s->authctxt->krb5_fwd_ccache, cell, NULL);
1656 
1657 		krb5_afslog_home(s->authctxt->krb5_ctx,
1658 		    s->authctxt->krb5_fwd_ccache, NULL, NULL, pw->pw_dir);
1659 	}
1660 #endif
1661 
1662 	/* Change current directory to the user's home directory. */
1663 	if (chdir(pw->pw_dir) < 0) {
1664 		/* Suppress missing homedir warning for chroot case */
1665 #ifdef HAVE_LOGIN_CAP
1666 		r = login_getcapbool(lc, "requirehome", 0);
1667 #endif
1668 		if (r || !in_chroot) {
1669 			fprintf(stderr, "Could not chdir to home "
1670 			    "directory %s: %s\n", pw->pw_dir,
1671 			    strerror(errno));
1672 		}
1673 		if (r)
1674 			exit(1);
1675 	}
1676 
1677 	closefrom(STDERR_FILENO + 1);
1678 
1679 	do_rc_files(ssh, s, shell);
1680 
1681 	/* restore SIGPIPE for child */
1682 	signal(SIGPIPE, SIG_DFL);
1683 
1684 	if (s->is_subsystem == SUBSYSTEM_INT_SFTP_ERROR) {
1685 		printf("This service allows sftp connections only.\n");
1686 		fflush(NULL);
1687 		exit(1);
1688 	} else if (s->is_subsystem == SUBSYSTEM_INT_SFTP) {
1689 		extern int optind, optreset;
1690 		int i;
1691 		char *p, *args;
1692 
1693 		setproctitle("%s@%s", s->pw->pw_name, INTERNAL_SFTP_NAME);
1694 		args = xstrdup(command ? command : "sftp-server");
1695 		for (i = 0, (p = strtok(args, " ")); p; (p = strtok(NULL, " ")))
1696 			if (i < ARGV_MAX - 1)
1697 				argv[i++] = p;
1698 		argv[i] = NULL;
1699 		optind = optreset = 1;
1700 		__progname = argv[0];
1701 #ifdef WITH_SELINUX
1702 		ssh_selinux_change_context("sftpd_t");
1703 #endif
1704 		exit(sftp_server_main(i, argv, s->pw));
1705 	}
1706 
1707 	fflush(NULL);
1708 
1709 	/* Get the last component of the shell name. */
1710 	if ((shell0 = strrchr(shell, '/')) != NULL)
1711 		shell0++;
1712 	else
1713 		shell0 = shell;
1714 
1715 	/*
1716 	 * If we have no command, execute the shell.  In this case, the shell
1717 	 * name to be passed in argv[0] is preceded by '-' to indicate that
1718 	 * this is a login shell.
1719 	 */
1720 	if (!command) {
1721 		char argv0[256];
1722 
1723 		/* Start the shell.  Set initial character to '-'. */
1724 		argv0[0] = '-';
1725 
1726 		if (strlcpy(argv0 + 1, shell0, sizeof(argv0) - 1)
1727 		    >= sizeof(argv0) - 1) {
1728 			errno = EINVAL;
1729 			perror(shell);
1730 			exit(1);
1731 		}
1732 
1733 		/* Execute the shell. */
1734 		argv[0] = argv0;
1735 		argv[1] = NULL;
1736 		execve(shell, argv, env);
1737 
1738 		/* Executing the shell failed. */
1739 		perror(shell);
1740 		exit(1);
1741 	}
1742 	/*
1743 	 * Execute the command using the user's shell.  This uses the -c
1744 	 * option to execute the command.
1745 	 */
1746 	argv[0] = (char *) shell0;
1747 	argv[1] = "-c";
1748 	argv[2] = (char *) command;
1749 	argv[3] = NULL;
1750 	execve(shell, argv, env);
1751 	perror(shell);
1752 	exit(1);
1753 }
1754 
1755 void
1756 session_unused(int id)
1757 {
1758 	debug3("%s: session id %d unused", __func__, id);
1759 	if (id >= options.max_sessions ||
1760 	    id >= sessions_nalloc) {
1761 		fatal("%s: insane session id %d (max %d nalloc %d)",
1762 		    __func__, id, options.max_sessions, sessions_nalloc);
1763 	}
1764 	memset(&sessions[id], 0, sizeof(*sessions));
1765 	sessions[id].self = id;
1766 	sessions[id].used = 0;
1767 	sessions[id].chanid = -1;
1768 	sessions[id].ptyfd = -1;
1769 	sessions[id].ttyfd = -1;
1770 	sessions[id].ptymaster = -1;
1771 	sessions[id].x11_chanids = NULL;
1772 	sessions[id].next_unused = sessions_first_unused;
1773 	sessions_first_unused = id;
1774 }
1775 
1776 Session *
1777 session_new(void)
1778 {
1779 	Session *s, *tmp;
1780 
1781 	if (sessions_first_unused == -1) {
1782 		if (sessions_nalloc >= options.max_sessions)
1783 			return NULL;
1784 		debug2("%s: allocate (allocated %d max %d)",
1785 		    __func__, sessions_nalloc, options.max_sessions);
1786 		tmp = xrecallocarray(sessions, sessions_nalloc,
1787 		    sessions_nalloc + 1, sizeof(*sessions));
1788 		if (tmp == NULL) {
1789 			error("%s: cannot allocate %d sessions",
1790 			    __func__, sessions_nalloc + 1);
1791 			return NULL;
1792 		}
1793 		sessions = tmp;
1794 		session_unused(sessions_nalloc++);
1795 	}
1796 
1797 	if (sessions_first_unused >= sessions_nalloc ||
1798 	    sessions_first_unused < 0) {
1799 		fatal("%s: insane first_unused %d max %d nalloc %d",
1800 		    __func__, sessions_first_unused, options.max_sessions,
1801 		    sessions_nalloc);
1802 	}
1803 
1804 	s = &sessions[sessions_first_unused];
1805 	if (s->used) {
1806 		fatal("%s: session %d already used",
1807 		    __func__, sessions_first_unused);
1808 	}
1809 	sessions_first_unused = s->next_unused;
1810 	s->used = 1;
1811 	s->next_unused = -1;
1812 	debug("session_new: session %d", s->self);
1813 
1814 	return s;
1815 }
1816 
1817 static void
1818 session_dump(void)
1819 {
1820 	int i;
1821 	for (i = 0; i < sessions_nalloc; i++) {
1822 		Session *s = &sessions[i];
1823 
1824 		debug("dump: used %d next_unused %d session %d %p "
1825 		    "channel %d pid %ld",
1826 		    s->used,
1827 		    s->next_unused,
1828 		    s->self,
1829 		    s,
1830 		    s->chanid,
1831 		    (long)s->pid);
1832 	}
1833 }
1834 
1835 int
1836 session_open(Authctxt *authctxt, int chanid)
1837 {
1838 	Session *s = session_new();
1839 	debug("session_open: channel %d", chanid);
1840 	if (s == NULL) {
1841 		error("no more sessions");
1842 		return 0;
1843 	}
1844 	s->authctxt = authctxt;
1845 	s->pw = authctxt->pw;
1846 	if (s->pw == NULL || !authctxt->valid)
1847 		fatal("no user for session %d", s->self);
1848 	debug("session_open: session %d: link with channel %d", s->self, chanid);
1849 	s->chanid = chanid;
1850 	return 1;
1851 }
1852 
1853 Session *
1854 session_by_tty(char *tty)
1855 {
1856 	int i;
1857 	for (i = 0; i < sessions_nalloc; i++) {
1858 		Session *s = &sessions[i];
1859 		if (s->used && s->ttyfd != -1 && strcmp(s->tty, tty) == 0) {
1860 			debug("session_by_tty: session %d tty %s", i, tty);
1861 			return s;
1862 		}
1863 	}
1864 	debug("session_by_tty: unknown tty %.100s", tty);
1865 	session_dump();
1866 	return NULL;
1867 }
1868 
1869 static Session *
1870 session_by_channel(int id)
1871 {
1872 	int i;
1873 	for (i = 0; i < sessions_nalloc; i++) {
1874 		Session *s = &sessions[i];
1875 		if (s->used && s->chanid == id) {
1876 			debug("session_by_channel: session %d channel %d",
1877 			    i, id);
1878 			return s;
1879 		}
1880 	}
1881 	debug("session_by_channel: unknown channel %d", id);
1882 	session_dump();
1883 	return NULL;
1884 }
1885 
1886 static Session *
1887 session_by_x11_channel(int id)
1888 {
1889 	int i, j;
1890 
1891 	for (i = 0; i < sessions_nalloc; i++) {
1892 		Session *s = &sessions[i];
1893 
1894 		if (s->x11_chanids == NULL || !s->used)
1895 			continue;
1896 		for (j = 0; s->x11_chanids[j] != -1; j++) {
1897 			if (s->x11_chanids[j] == id) {
1898 				debug("session_by_x11_channel: session %d "
1899 				    "channel %d", s->self, id);
1900 				return s;
1901 			}
1902 		}
1903 	}
1904 	debug("session_by_x11_channel: unknown channel %d", id);
1905 	session_dump();
1906 	return NULL;
1907 }
1908 
1909 static Session *
1910 session_by_pid(pid_t pid)
1911 {
1912 	int i;
1913 	debug("session_by_pid: pid %ld", (long)pid);
1914 	for (i = 0; i < sessions_nalloc; i++) {
1915 		Session *s = &sessions[i];
1916 		if (s->used && s->pid == pid)
1917 			return s;
1918 	}
1919 	error("session_by_pid: unknown pid %ld", (long)pid);
1920 	session_dump();
1921 	return NULL;
1922 }
1923 
1924 static int
1925 session_window_change_req(struct ssh *ssh, Session *s)
1926 {
1927 	s->col = packet_get_int();
1928 	s->row = packet_get_int();
1929 	s->xpixel = packet_get_int();
1930 	s->ypixel = packet_get_int();
1931 	packet_check_eom();
1932 	pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel);
1933 	return 1;
1934 }
1935 
1936 static int
1937 session_pty_req(struct ssh *ssh, Session *s)
1938 {
1939 	u_int len;
1940 
1941 	if (!auth_opts->permit_pty_flag || !options.permit_tty) {
1942 		debug("Allocating a pty not permitted for this connection.");
1943 		return 0;
1944 	}
1945 	if (s->ttyfd != -1) {
1946 		packet_disconnect("Protocol error: you already have a pty.");
1947 		return 0;
1948 	}
1949 
1950 	s->term = packet_get_string(&len);
1951 	s->col = packet_get_int();
1952 	s->row = packet_get_int();
1953 	s->xpixel = packet_get_int();
1954 	s->ypixel = packet_get_int();
1955 
1956 	if (strcmp(s->term, "") == 0) {
1957 		free(s->term);
1958 		s->term = NULL;
1959 	}
1960 
1961 	/* Allocate a pty and open it. */
1962 	debug("Allocating pty.");
1963 	if (!PRIVSEP(pty_allocate(&s->ptyfd, &s->ttyfd, s->tty,
1964 	    sizeof(s->tty)))) {
1965 		free(s->term);
1966 		s->term = NULL;
1967 		s->ptyfd = -1;
1968 		s->ttyfd = -1;
1969 		error("session_pty_req: session %d alloc failed", s->self);
1970 		return 0;
1971 	}
1972 	debug("session_pty_req: session %d alloc %s", s->self, s->tty);
1973 
1974 	ssh_tty_parse_modes(ssh, s->ttyfd);
1975 
1976 	if (!use_privsep)
1977 		pty_setowner(s->pw, s->tty);
1978 
1979 	/* Set window size from the packet. */
1980 	pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel);
1981 
1982 	packet_check_eom();
1983 	session_proctitle(s);
1984 	return 1;
1985 }
1986 
1987 static int
1988 session_subsystem_req(struct ssh *ssh, Session *s)
1989 {
1990 	struct stat st;
1991 	u_int len;
1992 	int success = 0;
1993 	char *prog, *cmd;
1994 	u_int i;
1995 
1996 	s->subsys = packet_get_string(&len);
1997 	packet_check_eom();
1998 	debug2("subsystem request for %.100s by user %s", s->subsys,
1999 	    s->pw->pw_name);
2000 
2001 	for (i = 0; i < options.num_subsystems; i++) {
2002 		if (strcmp(s->subsys, options.subsystem_name[i]) == 0) {
2003 			prog = options.subsystem_command[i];
2004 			cmd = options.subsystem_args[i];
2005 			if (strcmp(INTERNAL_SFTP_NAME, prog) == 0) {
2006 				s->is_subsystem = SUBSYSTEM_INT_SFTP;
2007 				debug("subsystem: %s", prog);
2008 			} else {
2009 				if (stat(prog, &st) < 0)
2010 					debug("subsystem: cannot stat %s: %s",
2011 					    prog, strerror(errno));
2012 				s->is_subsystem = SUBSYSTEM_EXT;
2013 				debug("subsystem: exec() %s", cmd);
2014 			}
2015 			success = do_exec(ssh, s, cmd) == 0;
2016 			break;
2017 		}
2018 	}
2019 
2020 	if (!success)
2021 		logit("subsystem request for %.100s by user %s failed, "
2022 		    "subsystem not found", s->subsys, s->pw->pw_name);
2023 
2024 	return success;
2025 }
2026 
2027 static int
2028 session_x11_req(struct ssh *ssh, Session *s)
2029 {
2030 	int success;
2031 
2032 	if (s->auth_proto != NULL || s->auth_data != NULL) {
2033 		error("session_x11_req: session %d: "
2034 		    "x11 forwarding already active", s->self);
2035 		return 0;
2036 	}
2037 	s->single_connection = packet_get_char();
2038 	s->auth_proto = packet_get_string(NULL);
2039 	s->auth_data = packet_get_string(NULL);
2040 	s->screen = packet_get_int();
2041 	packet_check_eom();
2042 
2043 	if (xauth_valid_string(s->auth_proto) &&
2044 	    xauth_valid_string(s->auth_data))
2045 		success = session_setup_x11fwd(ssh, s);
2046 	else {
2047 		success = 0;
2048 		error("Invalid X11 forwarding data");
2049 	}
2050 	if (!success) {
2051 		free(s->auth_proto);
2052 		free(s->auth_data);
2053 		s->auth_proto = NULL;
2054 		s->auth_data = NULL;
2055 	}
2056 	return success;
2057 }
2058 
2059 static int
2060 session_shell_req(struct ssh *ssh, Session *s)
2061 {
2062 	packet_check_eom();
2063 	return do_exec(ssh, s, NULL) == 0;
2064 }
2065 
2066 static int
2067 session_exec_req(struct ssh *ssh, Session *s)
2068 {
2069 	u_int len, success;
2070 
2071 	char *command = packet_get_string(&len);
2072 	packet_check_eom();
2073 	success = do_exec(ssh, s, command) == 0;
2074 	free(command);
2075 	return success;
2076 }
2077 
2078 static int
2079 session_break_req(struct ssh *ssh, Session *s)
2080 {
2081 
2082 	packet_get_int();	/* ignored */
2083 	packet_check_eom();
2084 
2085 	if (s->ptymaster == -1 || tcsendbreak(s->ptymaster, 0) < 0)
2086 		return 0;
2087 	return 1;
2088 }
2089 
2090 static int
2091 session_env_req(struct ssh *ssh, Session *s)
2092 {
2093 	char *name, *val;
2094 	u_int name_len, val_len, i;
2095 
2096 	name = packet_get_cstring(&name_len);
2097 	val = packet_get_cstring(&val_len);
2098 	packet_check_eom();
2099 
2100 	/* Don't set too many environment variables */
2101 	if (s->num_env > 128) {
2102 		debug2("Ignoring env request %s: too many env vars", name);
2103 		goto fail;
2104 	}
2105 
2106 	for (i = 0; i < options.num_accept_env; i++) {
2107 		if (match_pattern(name, options.accept_env[i])) {
2108 			debug2("Setting env %d: %s=%s", s->num_env, name, val);
2109 			s->env = xrecallocarray(s->env, s->num_env,
2110 			    s->num_env + 1, sizeof(*s->env));
2111 			s->env[s->num_env].name = name;
2112 			s->env[s->num_env].val = val;
2113 			s->num_env++;
2114 			return (1);
2115 		}
2116 	}
2117 	debug2("Ignoring env request %s: disallowed name", name);
2118 
2119  fail:
2120 	free(name);
2121 	free(val);
2122 	return (0);
2123 }
2124 
2125 /*
2126  * Conversion of signals from ssh channel request names.
2127  * Subset of signals from RFC 4254 section 6.10C, with SIGINFO as
2128  * local extension.
2129  */
2130 static int
2131 name2sig(char *name)
2132 {
2133 #define SSH_SIG(x) if (strcmp(name, #x) == 0) return SIG ## x
2134 	SSH_SIG(HUP);
2135 	SSH_SIG(INT);
2136 	SSH_SIG(KILL);
2137 	SSH_SIG(QUIT);
2138 	SSH_SIG(TERM);
2139 	SSH_SIG(USR1);
2140 	SSH_SIG(USR2);
2141 #undef	SSH_SIG
2142 #ifdef SIGINFO
2143 	if (strcmp(name, "INFO@openssh.com") == 0)
2144 		return SIGINFO;
2145 #endif
2146 	return -1;
2147 }
2148 
2149 static int
2150 session_signal_req(struct ssh *ssh, Session *s)
2151 {
2152 	char *signame = NULL;
2153 	int r, sig, success = 0;
2154 
2155 	if ((r = sshpkt_get_cstring(ssh, &signame, NULL)) != 0 ||
2156 	    (r = sshpkt_get_end(ssh)) != 0) {
2157 		error("%s: parse packet: %s", __func__, ssh_err(r));
2158 		goto out;
2159 	}
2160 	if ((sig = name2sig(signame)) == -1) {
2161 		error("%s: unsupported signal \"%s\"", __func__, signame);
2162 		goto out;
2163 	}
2164 	if (s->pid <= 0) {
2165 		error("%s: no pid for session %d", __func__, s->self);
2166 		goto out;
2167 	}
2168 	if (s->forced || s->is_subsystem) {
2169 		error("%s: refusing to send signal %s to %s session", __func__,
2170 		    signame, s->forced ? "forced-command" : "subsystem");
2171 		goto out;
2172 	}
2173 	if (!use_privsep || mm_is_monitor()) {
2174 		error("%s: session signalling requires privilege separation",
2175 		    __func__);
2176 		goto out;
2177 	}
2178 
2179 	debug("%s: signal %s, killpg(%ld, %d)", __func__, signame,
2180 	    (long)s->pid, sig);
2181 	temporarily_use_uid(s->pw);
2182 	r = killpg(s->pid, sig);
2183 	restore_uid();
2184 	if (r != 0) {
2185 		error("%s: killpg(%ld, %d): %s", __func__, (long)s->pid,
2186 		    sig, strerror(errno));
2187 		goto out;
2188 	}
2189 
2190 	/* success */
2191 	success = 1;
2192  out:
2193 	free(signame);
2194 	return success;
2195 }
2196 
2197 static int
2198 session_auth_agent_req(struct ssh *ssh, Session *s)
2199 {
2200 	static int called = 0;
2201 
2202 	packet_check_eom();
2203 	if (!auth_opts->permit_agent_forwarding_flag ||
2204 	    !options.allow_agent_forwarding) {
2205 		debug("%s: agent forwarding disabled", __func__);
2206 		return 0;
2207 	}
2208 	if (called) {
2209 		return 0;
2210 	} else {
2211 		called = 1;
2212 		return auth_input_request_forwarding(ssh, s->pw);
2213 	}
2214 }
2215 
2216 int
2217 session_input_channel_req(struct ssh *ssh, Channel *c, const char *rtype)
2218 {
2219 	int success = 0;
2220 	Session *s;
2221 
2222 	if ((s = session_by_channel(c->self)) == NULL) {
2223 		logit("%s: no session %d req %.100s", __func__, c->self, rtype);
2224 		return 0;
2225 	}
2226 	debug("%s: session %d req %s", __func__, s->self, rtype);
2227 
2228 	/*
2229 	 * a session is in LARVAL state until a shell, a command
2230 	 * or a subsystem is executed
2231 	 */
2232 	if (c->type == SSH_CHANNEL_LARVAL) {
2233 		if (strcmp(rtype, "shell") == 0) {
2234 			success = session_shell_req(ssh, s);
2235 		} else if (strcmp(rtype, "exec") == 0) {
2236 			success = session_exec_req(ssh, s);
2237 		} else if (strcmp(rtype, "pty-req") == 0) {
2238 			success = session_pty_req(ssh, s);
2239 		} else if (strcmp(rtype, "x11-req") == 0) {
2240 			success = session_x11_req(ssh, s);
2241 		} else if (strcmp(rtype, "auth-agent-req@openssh.com") == 0) {
2242 			success = session_auth_agent_req(ssh, s);
2243 		} else if (strcmp(rtype, "subsystem") == 0) {
2244 			success = session_subsystem_req(ssh, s);
2245 		} else if (strcmp(rtype, "env") == 0) {
2246 			success = session_env_req(ssh, s);
2247 		}
2248 	}
2249 	if (strcmp(rtype, "window-change") == 0) {
2250 		success = session_window_change_req(ssh, s);
2251 	} else if (strcmp(rtype, "break") == 0) {
2252 		success = session_break_req(ssh, s);
2253 	} else if (strcmp(rtype, "signal") == 0) {
2254 		success = session_signal_req(ssh, s);
2255 	}
2256 
2257 	return success;
2258 }
2259 
2260 void
2261 session_set_fds(struct ssh *ssh, Session *s,
2262     int fdin, int fdout, int fderr, int ignore_fderr, int is_tty)
2263 {
2264 	/*
2265 	 * now that have a child and a pipe to the child,
2266 	 * we can activate our channel and register the fd's
2267 	 */
2268 	if (s->chanid == -1)
2269 		fatal("no channel for session %d", s->self);
2270 	channel_set_fds(ssh, s->chanid,
2271 	    fdout, fdin, fderr,
2272 	    ignore_fderr ? CHAN_EXTENDED_IGNORE : CHAN_EXTENDED_READ,
2273 	    1, is_tty, CHAN_SES_WINDOW_DEFAULT);
2274 }
2275 
2276 /*
2277  * Function to perform pty cleanup. Also called if we get aborted abnormally
2278  * (e.g., due to a dropped connection).
2279  */
2280 void
2281 session_pty_cleanup2(Session *s)
2282 {
2283 	if (s == NULL) {
2284 		error("%s: no session", __func__);
2285 		return;
2286 	}
2287 	if (s->ttyfd == -1)
2288 		return;
2289 
2290 	debug("%s: session %d release %s", __func__, s->self, s->tty);
2291 
2292 	/* Record that the user has logged out. */
2293 	if (s->pid != 0)
2294 		record_logout(s->pid, s->tty, s->pw->pw_name);
2295 
2296 	/* Release the pseudo-tty. */
2297 	if (getuid() == 0)
2298 		pty_release(s->tty);
2299 
2300 	/*
2301 	 * Close the server side of the socket pairs.  We must do this after
2302 	 * the pty cleanup, so that another process doesn't get this pty
2303 	 * while we're still cleaning up.
2304 	 */
2305 	if (s->ptymaster != -1 && close(s->ptymaster) < 0)
2306 		error("close(s->ptymaster/%d): %s",
2307 		    s->ptymaster, strerror(errno));
2308 
2309 	/* unlink pty from session */
2310 	s->ttyfd = -1;
2311 }
2312 
2313 void
2314 session_pty_cleanup(Session *s)
2315 {
2316 	PRIVSEP(session_pty_cleanup2(s));
2317 }
2318 
2319 static char *
2320 sig2name(int sig)
2321 {
2322 #define SSH_SIG(x) if (sig == SIG ## x) return #x
2323 	SSH_SIG(ABRT);
2324 	SSH_SIG(ALRM);
2325 	SSH_SIG(FPE);
2326 	SSH_SIG(HUP);
2327 	SSH_SIG(ILL);
2328 	SSH_SIG(INT);
2329 	SSH_SIG(KILL);
2330 	SSH_SIG(PIPE);
2331 	SSH_SIG(QUIT);
2332 	SSH_SIG(SEGV);
2333 	SSH_SIG(TERM);
2334 	SSH_SIG(USR1);
2335 	SSH_SIG(USR2);
2336 #undef	SSH_SIG
2337 	return "SIG@openssh.com";
2338 }
2339 
2340 static void
2341 session_close_x11(struct ssh *ssh, int id)
2342 {
2343 	Channel *c;
2344 
2345 	if ((c = channel_by_id(ssh, id)) == NULL) {
2346 		debug("%s: x11 channel %d missing", __func__, id);
2347 	} else {
2348 		/* Detach X11 listener */
2349 		debug("%s: detach x11 channel %d", __func__, id);
2350 		channel_cancel_cleanup(ssh, id);
2351 		if (c->ostate != CHAN_OUTPUT_CLOSED)
2352 			chan_mark_dead(ssh, c);
2353 	}
2354 }
2355 
2356 static void
2357 session_close_single_x11(struct ssh *ssh, int id, void *arg)
2358 {
2359 	Session *s;
2360 	u_int i;
2361 
2362 	debug3("%s: channel %d", __func__, id);
2363 	channel_cancel_cleanup(ssh, id);
2364 	if ((s = session_by_x11_channel(id)) == NULL)
2365 		fatal("%s: no x11 channel %d", __func__, id);
2366 	for (i = 0; s->x11_chanids[i] != -1; i++) {
2367 		debug("%s: session %d: closing channel %d",
2368 		    __func__, s->self, s->x11_chanids[i]);
2369 		/*
2370 		 * The channel "id" is already closing, but make sure we
2371 		 * close all of its siblings.
2372 		 */
2373 		if (s->x11_chanids[i] != id)
2374 			session_close_x11(ssh, s->x11_chanids[i]);
2375 	}
2376 	free(s->x11_chanids);
2377 	s->x11_chanids = NULL;
2378 	free(s->display);
2379 	s->display = NULL;
2380 	free(s->auth_proto);
2381 	s->auth_proto = NULL;
2382 	free(s->auth_data);
2383 	s->auth_data = NULL;
2384 	free(s->auth_display);
2385 	s->auth_display = NULL;
2386 }
2387 
2388 static void
2389 session_exit_message(struct ssh *ssh, Session *s, int status)
2390 {
2391 	Channel *c;
2392 
2393 	if ((c = channel_lookup(ssh, s->chanid)) == NULL)
2394 		fatal("%s: session %d: no channel %d",
2395 		    __func__, s->self, s->chanid);
2396 	debug("%s: session %d channel %d pid %ld",
2397 	    __func__, s->self, s->chanid, (long)s->pid);
2398 
2399 	if (WIFEXITED(status)) {
2400 		channel_request_start(ssh, s->chanid, "exit-status", 0);
2401 		packet_put_int(WEXITSTATUS(status));
2402 		packet_send();
2403 	} else if (WIFSIGNALED(status)) {
2404 		channel_request_start(ssh, s->chanid, "exit-signal", 0);
2405 		packet_put_cstring(sig2name(WTERMSIG(status)));
2406 #ifdef WCOREDUMP
2407 		packet_put_char(WCOREDUMP(status)? 1 : 0);
2408 #else /* WCOREDUMP */
2409 		packet_put_char(0);
2410 #endif /* WCOREDUMP */
2411 		packet_put_cstring("");
2412 		packet_put_cstring("");
2413 		packet_send();
2414 	} else {
2415 		/* Some weird exit cause.  Just exit. */
2416 		packet_disconnect("wait returned status %04x.", status);
2417 	}
2418 
2419 	/* disconnect channel */
2420 	debug("%s: release channel %d", __func__, s->chanid);
2421 
2422 	/*
2423 	 * Adjust cleanup callback attachment to send close messages when
2424 	 * the channel gets EOF. The session will be then be closed
2425 	 * by session_close_by_channel when the childs close their fds.
2426 	 */
2427 	channel_register_cleanup(ssh, c->self, session_close_by_channel, 1);
2428 
2429 	/*
2430 	 * emulate a write failure with 'chan_write_failed', nobody will be
2431 	 * interested in data we write.
2432 	 * Note that we must not call 'chan_read_failed', since there could
2433 	 * be some more data waiting in the pipe.
2434 	 */
2435 	if (c->ostate != CHAN_OUTPUT_CLOSED)
2436 		chan_write_failed(ssh, c);
2437 }
2438 
2439 void
2440 session_close(struct ssh *ssh, Session *s)
2441 {
2442 	u_int i;
2443 
2444 	verbose("Close session: user %s from %.200s port %d id %d",
2445 	    s->pw->pw_name,
2446 	    ssh_remote_ipaddr(ssh),
2447 	    ssh_remote_port(ssh),
2448 	    s->self);
2449 
2450 	if (s->ttyfd != -1)
2451 		session_pty_cleanup(s);
2452 	free(s->term);
2453 	free(s->display);
2454 	free(s->x11_chanids);
2455 	free(s->auth_display);
2456 	free(s->auth_data);
2457 	free(s->auth_proto);
2458 	free(s->subsys);
2459 	if (s->env != NULL) {
2460 		for (i = 0; i < s->num_env; i++) {
2461 			free(s->env[i].name);
2462 			free(s->env[i].val);
2463 		}
2464 		free(s->env);
2465 	}
2466 	session_proctitle(s);
2467 	session_unused(s->self);
2468 }
2469 
2470 void
2471 session_close_by_pid(struct ssh *ssh, pid_t pid, int status)
2472 {
2473 	Session *s = session_by_pid(pid);
2474 	if (s == NULL) {
2475 		debug("%s: no session for pid %ld", __func__, (long)pid);
2476 		return;
2477 	}
2478 	if (s->chanid != -1)
2479 		session_exit_message(ssh, s, status);
2480 	if (s->ttyfd != -1)
2481 		session_pty_cleanup(s);
2482 	s->pid = 0;
2483 }
2484 
2485 /*
2486  * this is called when a channel dies before
2487  * the session 'child' itself dies
2488  */
2489 void
2490 session_close_by_channel(struct ssh *ssh, int id, void *arg)
2491 {
2492 	Session *s = session_by_channel(id);
2493 	u_int i;
2494 
2495 	if (s == NULL) {
2496 		debug("%s: no session for id %d", __func__, id);
2497 		return;
2498 	}
2499 	debug("%s: channel %d child %ld", __func__, id, (long)s->pid);
2500 	if (s->pid != 0) {
2501 		debug("%s: channel %d: has child, ttyfd %d",
2502 		    __func__, id, s->ttyfd);
2503 		/*
2504 		 * delay detach of session, but release pty, since
2505 		 * the fd's to the child are already closed
2506 		 */
2507 		if (s->ttyfd != -1)
2508 			session_pty_cleanup(s);
2509 		return;
2510 	}
2511 	/* detach by removing callback */
2512 	channel_cancel_cleanup(ssh, s->chanid);
2513 
2514 	/* Close any X11 listeners associated with this session */
2515 	if (s->x11_chanids != NULL) {
2516 		for (i = 0; s->x11_chanids[i] != -1; i++) {
2517 			session_close_x11(ssh, s->x11_chanids[i]);
2518 			s->x11_chanids[i] = -1;
2519 		}
2520 	}
2521 
2522 	s->chanid = -1;
2523 	session_close(ssh, s);
2524 }
2525 
2526 void
2527 session_destroy_all(struct ssh *ssh, void (*closefunc)(Session *))
2528 {
2529 	int i;
2530 	for (i = 0; i < sessions_nalloc; i++) {
2531 		Session *s = &sessions[i];
2532 		if (s->used) {
2533 			if (closefunc != NULL)
2534 				closefunc(s);
2535 			else
2536 				session_close(ssh, s);
2537 		}
2538 	}
2539 }
2540 
2541 static char *
2542 session_tty_list(void)
2543 {
2544 	static char buf[1024];
2545 	int i;
2546 	char *cp;
2547 
2548 	buf[0] = '\0';
2549 	for (i = 0; i < sessions_nalloc; i++) {
2550 		Session *s = &sessions[i];
2551 		if (s->used && s->ttyfd != -1) {
2552 
2553 			if (strncmp(s->tty, "/dev/", 5) != 0) {
2554 				cp = strrchr(s->tty, '/');
2555 				cp = (cp == NULL) ? s->tty : cp + 1;
2556 			} else
2557 				cp = s->tty + 5;
2558 
2559 			if (buf[0] != '\0')
2560 				strlcat(buf, ",", sizeof buf);
2561 			strlcat(buf, cp, sizeof buf);
2562 		}
2563 	}
2564 	if (buf[0] == '\0')
2565 		strlcpy(buf, "notty", sizeof buf);
2566 	return buf;
2567 }
2568 
2569 void
2570 session_proctitle(Session *s)
2571 {
2572 	if (s->pw == NULL)
2573 		error("no user for session %d", s->self);
2574 	else
2575 		setproctitle("%s@%s", s->pw->pw_name, session_tty_list());
2576 }
2577 
2578 int
2579 session_setup_x11fwd(struct ssh *ssh, Session *s)
2580 {
2581 	struct stat st;
2582 	char display[512], auth_display[512];
2583 	char hostname[NI_MAXHOST];
2584 	u_int i;
2585 
2586 	if (!auth_opts->permit_x11_forwarding_flag) {
2587 		packet_send_debug("X11 forwarding disabled by key options.");
2588 		return 0;
2589 	}
2590 	if (!options.x11_forwarding) {
2591 		debug("X11 forwarding disabled in server configuration file.");
2592 		return 0;
2593 	}
2594 	if (options.xauth_location == NULL ||
2595 	    (stat(options.xauth_location, &st) == -1)) {
2596 		packet_send_debug("No xauth program; cannot forward X11.");
2597 		return 0;
2598 	}
2599 	if (s->display != NULL) {
2600 		debug("X11 display already set.");
2601 		return 0;
2602 	}
2603 	if (x11_create_display_inet(ssh, options.x11_display_offset,
2604 	    options.x11_use_localhost, s->single_connection,
2605 	    &s->display_number, &s->x11_chanids) == -1) {
2606 		debug("x11_create_display_inet failed.");
2607 		return 0;
2608 	}
2609 	for (i = 0; s->x11_chanids[i] != -1; i++) {
2610 		channel_register_cleanup(ssh, s->x11_chanids[i],
2611 		    session_close_single_x11, 0);
2612 	}
2613 
2614 	/* Set up a suitable value for the DISPLAY variable. */
2615 	if (gethostname(hostname, sizeof(hostname)) < 0)
2616 		fatal("gethostname: %.100s", strerror(errno));
2617 	/*
2618 	 * auth_display must be used as the displayname when the
2619 	 * authorization entry is added with xauth(1).  This will be
2620 	 * different than the DISPLAY string for localhost displays.
2621 	 */
2622 	if (options.x11_use_localhost) {
2623 		snprintf(display, sizeof display, "localhost:%u.%u",
2624 		    s->display_number, s->screen);
2625 		snprintf(auth_display, sizeof auth_display, "unix:%u.%u",
2626 		    s->display_number, s->screen);
2627 		s->display = xstrdup(display);
2628 		s->auth_display = xstrdup(auth_display);
2629 	} else {
2630 #ifdef IPADDR_IN_DISPLAY
2631 		struct hostent *he;
2632 		struct in_addr my_addr;
2633 
2634 		he = gethostbyname(hostname);
2635 		if (he == NULL) {
2636 			error("Can't get IP address for X11 DISPLAY.");
2637 			packet_send_debug("Can't get IP address for X11 DISPLAY.");
2638 			return 0;
2639 		}
2640 		memcpy(&my_addr, he->h_addr_list[0], sizeof(struct in_addr));
2641 		snprintf(display, sizeof display, "%.50s:%u.%u", inet_ntoa(my_addr),
2642 		    s->display_number, s->screen);
2643 #else
2644 		snprintf(display, sizeof display, "%.400s:%u.%u", hostname,
2645 		    s->display_number, s->screen);
2646 #endif
2647 		s->display = xstrdup(display);
2648 		s->auth_display = xstrdup(display);
2649 	}
2650 
2651 	return 1;
2652 }
2653 
2654 static void
2655 do_authenticated2(struct ssh *ssh, Authctxt *authctxt)
2656 {
2657 	server_loop2(ssh, authctxt);
2658 }
2659 
2660 void
2661 do_cleanup(struct ssh *ssh, Authctxt *authctxt)
2662 {
2663 	static int called = 0;
2664 
2665 	debug("do_cleanup");
2666 
2667 	/* no cleanup if we're in the child for login shell */
2668 	if (is_child)
2669 		return;
2670 
2671 	/* avoid double cleanup */
2672 	if (called)
2673 		return;
2674 	called = 1;
2675 
2676 	if (authctxt == NULL)
2677 		return;
2678 
2679 #ifdef USE_PAM
2680 	if (options.use_pam) {
2681 		sshpam_cleanup();
2682 		sshpam_thread_cleanup();
2683 	}
2684 #endif
2685 
2686 	if (!authctxt->authenticated)
2687 		return;
2688 
2689 #ifdef KRB5
2690 	if (options.kerberos_ticket_cleanup &&
2691 	    authctxt->krb5_ctx)
2692 		krb5_cleanup_proc(authctxt);
2693 #endif
2694 
2695 #ifdef GSSAPI
2696 	if (options.gss_cleanup_creds)
2697 		ssh_gssapi_cleanup_creds();
2698 #endif
2699 
2700 	/* remove agent socket */
2701 	auth_sock_cleanup_proc(authctxt->pw);
2702 
2703 	/* remove userauth info */
2704 	if (auth_info_file != NULL) {
2705 		temporarily_use_uid(authctxt->pw);
2706 		unlink(auth_info_file);
2707 		restore_uid();
2708 		free(auth_info_file);
2709 		auth_info_file = NULL;
2710 	}
2711 
2712 	/*
2713 	 * Cleanup ptys/utmp only if privsep is disabled,
2714 	 * or if running in monitor.
2715 	 */
2716 	if (!use_privsep || mm_is_monitor())
2717 		session_destroy_all(ssh, session_pty_cleanup2);
2718 }
2719 
2720 /* Return a name for the remote host that fits inside utmp_size */
2721 
2722 const char *
2723 session_get_remote_name_or_ip(struct ssh *ssh, u_int utmp_size, int use_dns)
2724 {
2725 	const char *remote = "";
2726 
2727 	if (utmp_size > 0)
2728 		remote = auth_get_canonical_hostname(ssh, use_dns);
2729 	if (utmp_size == 0 || strlen(remote) > utmp_size)
2730 		remote = ssh_remote_ipaddr(ssh);
2731 	return remote;
2732 }
2733 
2734