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