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