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