clientloop.c revision 164146
1/* $OpenBSD: clientloop.c,v 1.176 2006/10/11 12:38:03 markus Exp $ */
2/*
3 * Author: Tatu Ylonen <ylo@cs.hut.fi>
4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5 *                    All rights reserved
6 * The main loop for the interactive session (client side).
7 *
8 * As far as I am concerned, the code I have written for this software
9 * can be used freely for any purpose.  Any derived versions of this
10 * software must be clearly marked as such, and if the derived work is
11 * incompatible with the protocol description in the RFC file, it must be
12 * called by a name other than "ssh" or "Secure Shell".
13 *
14 *
15 * Copyright (c) 1999 Theo de Raadt.  All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 *    notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 *    notice, this list of conditions and the following disclaimer in the
24 *    documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 *
38 * SSH2 support added by Markus Friedl.
39 * Copyright (c) 1999, 2000, 2001 Markus Friedl.  All rights reserved.
40 *
41 * Redistribution and use in source and binary forms, with or without
42 * modification, are permitted provided that the following conditions
43 * are met:
44 * 1. Redistributions of source code must retain the above copyright
45 *    notice, this list of conditions and the following disclaimer.
46 * 2. Redistributions in binary form must reproduce the above copyright
47 *    notice, this list of conditions and the following disclaimer in the
48 *    documentation and/or other materials provided with the distribution.
49 *
50 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
51 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
52 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
53 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
54 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
55 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
56 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
57 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
58 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
59 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
60 */
61
62#include "includes.h"
63
64#include <sys/types.h>
65#include <sys/ioctl.h>
66#include <sys/param.h>
67#ifdef HAVE_SYS_STAT_H
68# include <sys/stat.h>
69#endif
70#ifdef HAVE_SYS_TIME_H
71# include <sys/time.h>
72#endif
73#include <sys/socket.h>
74
75#include <ctype.h>
76#include <errno.h>
77#ifdef HAVE_PATHS_H
78#include <paths.h>
79#endif
80#include <signal.h>
81#include <stdarg.h>
82#include <stdio.h>
83#include <stdlib.h>
84#include <string.h>
85#include <termios.h>
86#include <pwd.h>
87#include <unistd.h>
88
89#include "xmalloc.h"
90#include "ssh.h"
91#include "ssh1.h"
92#include "ssh2.h"
93#include "packet.h"
94#include "buffer.h"
95#include "compat.h"
96#include "channels.h"
97#include "dispatch.h"
98#include "key.h"
99#include "cipher.h"
100#include "kex.h"
101#include "log.h"
102#include "readconf.h"
103#include "clientloop.h"
104#include "sshconnect.h"
105#include "authfd.h"
106#include "atomicio.h"
107#include "sshpty.h"
108#include "misc.h"
109#include "monitor_fdpass.h"
110#include "match.h"
111#include "msg.h"
112
113/* import options */
114extern Options options;
115
116/* Flag indicating that stdin should be redirected from /dev/null. */
117extern int stdin_null_flag;
118
119/* Flag indicating that no shell has been requested */
120extern int no_shell_flag;
121
122/* Control socket */
123extern int control_fd;
124
125/*
126 * Name of the host we are connecting to.  This is the name given on the
127 * command line, or the HostName specified for the user-supplied name in a
128 * configuration file.
129 */
130extern char *host;
131
132/*
133 * Flag to indicate that we have received a window change signal which has
134 * not yet been processed.  This will cause a message indicating the new
135 * window size to be sent to the server a little later.  This is volatile
136 * because this is updated in a signal handler.
137 */
138static volatile sig_atomic_t received_window_change_signal = 0;
139static volatile sig_atomic_t received_signal = 0;
140
141/* Flag indicating whether the user's terminal is in non-blocking mode. */
142static int in_non_blocking_mode = 0;
143
144/* Common data for the client loop code. */
145static volatile sig_atomic_t quit_pending; /* Set non-zero to quit the loop. */
146static int escape_char;		/* Escape character. */
147static int escape_pending;	/* Last character was the escape character */
148static int last_was_cr;		/* Last character was a newline. */
149static int exit_status;		/* Used to store the exit status of the command. */
150static int stdin_eof;		/* EOF has been encountered on standard error. */
151static Buffer stdin_buffer;	/* Buffer for stdin data. */
152static Buffer stdout_buffer;	/* Buffer for stdout data. */
153static Buffer stderr_buffer;	/* Buffer for stderr data. */
154static u_long stdin_bytes, stdout_bytes, stderr_bytes;
155static u_int buffer_high;/* Soft max buffer size. */
156static int connection_in;	/* Connection to server (input). */
157static int connection_out;	/* Connection to server (output). */
158static int need_rekeying;	/* Set to non-zero if rekeying is requested. */
159static int session_closed = 0;	/* In SSH2: login session closed. */
160static int server_alive_timeouts = 0;
161
162static void client_init_dispatch(void);
163int	session_ident = -1;
164
165struct confirm_ctx {
166	int want_tty;
167	int want_subsys;
168	int want_x_fwd;
169	int want_agent_fwd;
170	Buffer cmd;
171	char *term;
172	struct termios tio;
173	char **env;
174};
175
176/*XXX*/
177extern Kex *xxx_kex;
178
179void ssh_process_session2_setup(int, int, int, Buffer *);
180
181/* Restores stdin to blocking mode. */
182
183static void
184leave_non_blocking(void)
185{
186	if (in_non_blocking_mode) {
187		unset_nonblock(fileno(stdin));
188		in_non_blocking_mode = 0;
189	}
190}
191
192/* Puts stdin terminal in non-blocking mode. */
193
194static void
195enter_non_blocking(void)
196{
197	in_non_blocking_mode = 1;
198	set_nonblock(fileno(stdin));
199}
200
201/*
202 * Signal handler for the window change signal (SIGWINCH).  This just sets a
203 * flag indicating that the window has changed.
204 */
205/*ARGSUSED */
206static void
207window_change_handler(int sig)
208{
209	received_window_change_signal = 1;
210	signal(SIGWINCH, window_change_handler);
211}
212
213/*
214 * Signal handler for signals that cause the program to terminate.  These
215 * signals must be trapped to restore terminal modes.
216 */
217/*ARGSUSED */
218static void
219signal_handler(int sig)
220{
221	received_signal = sig;
222	quit_pending = 1;
223}
224
225/*
226 * Returns current time in seconds from Jan 1, 1970 with the maximum
227 * available resolution.
228 */
229
230static double
231get_current_time(void)
232{
233	struct timeval tv;
234	gettimeofday(&tv, NULL);
235	return (double) tv.tv_sec + (double) tv.tv_usec / 1000000.0;
236}
237
238#define SSH_X11_PROTO "MIT-MAGIC-COOKIE-1"
239void
240client_x11_get_proto(const char *display, const char *xauth_path,
241    u_int trusted, char **_proto, char **_data)
242{
243	char cmd[1024];
244	char line[512];
245	char xdisplay[512];
246	static char proto[512], data[512];
247	FILE *f;
248	int got_data = 0, generated = 0, do_unlink = 0, i;
249	char *xauthdir, *xauthfile;
250	struct stat st;
251
252	xauthdir = xauthfile = NULL;
253	*_proto = proto;
254	*_data = data;
255	proto[0] = data[0] = '\0';
256
257	if (xauth_path == NULL ||(stat(xauth_path, &st) == -1)) {
258		debug("No xauth program.");
259	} else {
260		if (display == NULL) {
261			debug("x11_get_proto: DISPLAY not set");
262			return;
263		}
264		/*
265		 * Handle FamilyLocal case where $DISPLAY does
266		 * not match an authorization entry.  For this we
267		 * just try "xauth list unix:displaynum.screennum".
268		 * XXX: "localhost" match to determine FamilyLocal
269		 *      is not perfect.
270		 */
271		if (strncmp(display, "localhost:", 10) == 0) {
272			snprintf(xdisplay, sizeof(xdisplay), "unix:%s",
273			    display + 10);
274			display = xdisplay;
275		}
276		if (trusted == 0) {
277			xauthdir = xmalloc(MAXPATHLEN);
278			xauthfile = xmalloc(MAXPATHLEN);
279			strlcpy(xauthdir, "/tmp/ssh-XXXXXXXXXX", MAXPATHLEN);
280			if (mkdtemp(xauthdir) != NULL) {
281				do_unlink = 1;
282				snprintf(xauthfile, MAXPATHLEN, "%s/xauthfile",
283				    xauthdir);
284				snprintf(cmd, sizeof(cmd),
285				    "%s -f %s generate %s " SSH_X11_PROTO
286				    " untrusted timeout 1200 2>" _PATH_DEVNULL,
287				    xauth_path, xauthfile, display);
288				debug2("x11_get_proto: %s", cmd);
289				if (system(cmd) == 0)
290					generated = 1;
291			}
292		}
293		snprintf(cmd, sizeof(cmd),
294		    "%s %s%s list %s 2>" _PATH_DEVNULL,
295		    xauth_path,
296		    generated ? "-f " : "" ,
297		    generated ? xauthfile : "",
298		    display);
299		debug2("x11_get_proto: %s", cmd);
300		f = popen(cmd, "r");
301		if (f && fgets(line, sizeof(line), f) &&
302		    sscanf(line, "%*s %511s %511s", proto, data) == 2)
303			got_data = 1;
304		if (f)
305			pclose(f);
306	}
307
308	if (do_unlink) {
309		unlink(xauthfile);
310		rmdir(xauthdir);
311	}
312	if (xauthdir)
313		xfree(xauthdir);
314	if (xauthfile)
315		xfree(xauthfile);
316
317	/*
318	 * If we didn't get authentication data, just make up some
319	 * data.  The forwarding code will check the validity of the
320	 * response anyway, and substitute this data.  The X11
321	 * server, however, will ignore this fake data and use
322	 * whatever authentication mechanisms it was using otherwise
323	 * for the local connection.
324	 */
325	if (!got_data) {
326		u_int32_t rnd = 0;
327
328		logit("Warning: No xauth data; "
329		    "using fake authentication data for X11 forwarding.");
330		strlcpy(proto, SSH_X11_PROTO, sizeof proto);
331		for (i = 0; i < 16; i++) {
332			if (i % 4 == 0)
333				rnd = arc4random();
334			snprintf(data + 2 * i, sizeof data - 2 * i, "%02x",
335			    rnd & 0xff);
336			rnd >>= 8;
337		}
338	}
339}
340
341/*
342 * This is called when the interactive is entered.  This checks if there is
343 * an EOF coming on stdin.  We must check this explicitly, as select() does
344 * not appear to wake up when redirecting from /dev/null.
345 */
346
347static void
348client_check_initial_eof_on_stdin(void)
349{
350	int len;
351	char buf[1];
352
353	/*
354	 * If standard input is to be "redirected from /dev/null", we simply
355	 * mark that we have seen an EOF and send an EOF message to the
356	 * server. Otherwise, we try to read a single character; it appears
357	 * that for some files, such /dev/null, select() never wakes up for
358	 * read for this descriptor, which means that we never get EOF.  This
359	 * way we will get the EOF if stdin comes from /dev/null or similar.
360	 */
361	if (stdin_null_flag) {
362		/* Fake EOF on stdin. */
363		debug("Sending eof.");
364		stdin_eof = 1;
365		packet_start(SSH_CMSG_EOF);
366		packet_send();
367	} else {
368		enter_non_blocking();
369
370		/* Check for immediate EOF on stdin. */
371		len = read(fileno(stdin), buf, 1);
372		if (len == 0) {
373			/* EOF.  Record that we have seen it and send EOF to server. */
374			debug("Sending eof.");
375			stdin_eof = 1;
376			packet_start(SSH_CMSG_EOF);
377			packet_send();
378		} else if (len > 0) {
379			/*
380			 * Got data.  We must store the data in the buffer,
381			 * and also process it as an escape character if
382			 * appropriate.
383			 */
384			if ((u_char) buf[0] == escape_char)
385				escape_pending = 1;
386			else
387				buffer_append(&stdin_buffer, buf, 1);
388		}
389		leave_non_blocking();
390	}
391}
392
393
394/*
395 * Make packets from buffered stdin data, and buffer them for sending to the
396 * connection.
397 */
398
399static void
400client_make_packets_from_stdin_data(void)
401{
402	u_int len;
403
404	/* Send buffered stdin data to the server. */
405	while (buffer_len(&stdin_buffer) > 0 &&
406	    packet_not_very_much_data_to_write()) {
407		len = buffer_len(&stdin_buffer);
408		/* Keep the packets at reasonable size. */
409		if (len > packet_get_maxsize())
410			len = packet_get_maxsize();
411		packet_start(SSH_CMSG_STDIN_DATA);
412		packet_put_string(buffer_ptr(&stdin_buffer), len);
413		packet_send();
414		buffer_consume(&stdin_buffer, len);
415		stdin_bytes += len;
416		/* If we have a pending EOF, send it now. */
417		if (stdin_eof && buffer_len(&stdin_buffer) == 0) {
418			packet_start(SSH_CMSG_EOF);
419			packet_send();
420		}
421	}
422}
423
424/*
425 * Checks if the client window has changed, and sends a packet about it to
426 * the server if so.  The actual change is detected elsewhere (by a software
427 * interrupt on Unix); this just checks the flag and sends a message if
428 * appropriate.
429 */
430
431static void
432client_check_window_change(void)
433{
434	struct winsize ws;
435
436	if (! received_window_change_signal)
437		return;
438	/** XXX race */
439	received_window_change_signal = 0;
440
441	debug2("client_check_window_change: changed");
442
443	if (compat20) {
444		channel_send_window_changes();
445	} else {
446		if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) < 0)
447			return;
448		packet_start(SSH_CMSG_WINDOW_SIZE);
449		packet_put_int((u_int)ws.ws_row);
450		packet_put_int((u_int)ws.ws_col);
451		packet_put_int((u_int)ws.ws_xpixel);
452		packet_put_int((u_int)ws.ws_ypixel);
453		packet_send();
454	}
455}
456
457static void
458client_global_request_reply(int type, u_int32_t seq, void *ctxt)
459{
460	server_alive_timeouts = 0;
461	client_global_request_reply_fwd(type, seq, ctxt);
462}
463
464static void
465server_alive_check(void)
466{
467	if (++server_alive_timeouts > options.server_alive_count_max) {
468		logit("Timeout, server not responding.");
469		cleanup_exit(255);
470	}
471	packet_start(SSH2_MSG_GLOBAL_REQUEST);
472	packet_put_cstring("keepalive@openssh.com");
473	packet_put_char(1);     /* boolean: want reply */
474	packet_send();
475}
476
477/*
478 * Waits until the client can do something (some data becomes available on
479 * one of the file descriptors).
480 */
481static void
482client_wait_until_can_do_something(fd_set **readsetp, fd_set **writesetp,
483    int *maxfdp, u_int *nallocp, int rekeying)
484{
485	struct timeval tv, *tvp;
486	int ret;
487
488	/* Add any selections by the channel mechanism. */
489	channel_prepare_select(readsetp, writesetp, maxfdp, nallocp, rekeying);
490
491	if (!compat20) {
492		/* Read from the connection, unless our buffers are full. */
493		if (buffer_len(&stdout_buffer) < buffer_high &&
494		    buffer_len(&stderr_buffer) < buffer_high &&
495		    channel_not_very_much_buffered_data())
496			FD_SET(connection_in, *readsetp);
497		/*
498		 * Read from stdin, unless we have seen EOF or have very much
499		 * buffered data to send to the server.
500		 */
501		if (!stdin_eof && packet_not_very_much_data_to_write())
502			FD_SET(fileno(stdin), *readsetp);
503
504		/* Select stdout/stderr if have data in buffer. */
505		if (buffer_len(&stdout_buffer) > 0)
506			FD_SET(fileno(stdout), *writesetp);
507		if (buffer_len(&stderr_buffer) > 0)
508			FD_SET(fileno(stderr), *writesetp);
509	} else {
510		/* channel_prepare_select could have closed the last channel */
511		if (session_closed && !channel_still_open() &&
512		    !packet_have_data_to_write()) {
513			/* clear mask since we did not call select() */
514			memset(*readsetp, 0, *nallocp);
515			memset(*writesetp, 0, *nallocp);
516			return;
517		} else {
518			FD_SET(connection_in, *readsetp);
519		}
520	}
521
522	/* Select server connection if have data to write to the server. */
523	if (packet_have_data_to_write())
524		FD_SET(connection_out, *writesetp);
525
526	if (control_fd != -1)
527		FD_SET(control_fd, *readsetp);
528
529	/*
530	 * Wait for something to happen.  This will suspend the process until
531	 * some selected descriptor can be read, written, or has some other
532	 * event pending.
533	 */
534
535	if (options.server_alive_interval == 0 || !compat20)
536		tvp = NULL;
537	else {
538		tv.tv_sec = options.server_alive_interval;
539		tv.tv_usec = 0;
540		tvp = &tv;
541	}
542	ret = select((*maxfdp)+1, *readsetp, *writesetp, NULL, tvp);
543	if (ret < 0) {
544		char buf[100];
545
546		/*
547		 * We have to clear the select masks, because we return.
548		 * We have to return, because the mainloop checks for the flags
549		 * set by the signal handlers.
550		 */
551		memset(*readsetp, 0, *nallocp);
552		memset(*writesetp, 0, *nallocp);
553
554		if (errno == EINTR)
555			return;
556		/* Note: we might still have data in the buffers. */
557		snprintf(buf, sizeof buf, "select: %s\r\n", strerror(errno));
558		buffer_append(&stderr_buffer, buf, strlen(buf));
559		quit_pending = 1;
560	} else if (ret == 0)
561		server_alive_check();
562}
563
564static void
565client_suspend_self(Buffer *bin, Buffer *bout, Buffer *berr)
566{
567	/* Flush stdout and stderr buffers. */
568	if (buffer_len(bout) > 0)
569		atomicio(vwrite, fileno(stdout), buffer_ptr(bout), buffer_len(bout));
570	if (buffer_len(berr) > 0)
571		atomicio(vwrite, fileno(stderr), buffer_ptr(berr), buffer_len(berr));
572
573	leave_raw_mode();
574
575	/*
576	 * Free (and clear) the buffer to reduce the amount of data that gets
577	 * written to swap.
578	 */
579	buffer_free(bin);
580	buffer_free(bout);
581	buffer_free(berr);
582
583	/* Send the suspend signal to the program itself. */
584	kill(getpid(), SIGTSTP);
585
586	/* Reset window sizes in case they have changed */
587	received_window_change_signal = 1;
588
589	/* OK, we have been continued by the user. Reinitialize buffers. */
590	buffer_init(bin);
591	buffer_init(bout);
592	buffer_init(berr);
593
594	enter_raw_mode();
595}
596
597static void
598client_process_net_input(fd_set *readset)
599{
600	int len;
601	char buf[8192];
602
603	/*
604	 * Read input from the server, and add any such data to the buffer of
605	 * the packet subsystem.
606	 */
607	if (FD_ISSET(connection_in, readset)) {
608		/* Read as much as possible. */
609		len = read(connection_in, buf, sizeof(buf));
610		if (len == 0) {
611			/* Received EOF.  The remote host has closed the connection. */
612			snprintf(buf, sizeof buf, "Connection to %.300s closed by remote host.\r\n",
613				 host);
614			buffer_append(&stderr_buffer, buf, strlen(buf));
615			quit_pending = 1;
616			return;
617		}
618		/*
619		 * There is a kernel bug on Solaris that causes select to
620		 * sometimes wake up even though there is no data available.
621		 */
622		if (len < 0 && (errno == EAGAIN || errno == EINTR))
623			len = 0;
624
625		if (len < 0) {
626			/* An error has encountered.  Perhaps there is a network problem. */
627			snprintf(buf, sizeof buf, "Read from remote host %.300s: %.100s\r\n",
628				 host, strerror(errno));
629			buffer_append(&stderr_buffer, buf, strlen(buf));
630			quit_pending = 1;
631			return;
632		}
633		packet_process_incoming(buf, len);
634	}
635}
636
637static void
638client_subsystem_reply(int type, u_int32_t seq, void *ctxt)
639{
640	int id;
641	Channel *c;
642
643	id = packet_get_int();
644	packet_check_eom();
645
646	if ((c = channel_lookup(id)) == NULL) {
647		error("%s: no channel for id %d", __func__, id);
648		return;
649	}
650
651	if (type == SSH2_MSG_CHANNEL_SUCCESS)
652		debug2("Request suceeded on channel %d", id);
653	else if (type == SSH2_MSG_CHANNEL_FAILURE) {
654		error("Request failed on channel %d", id);
655		channel_free(c);
656	}
657}
658
659static void
660client_extra_session2_setup(int id, void *arg)
661{
662	struct confirm_ctx *cctx = arg;
663	const char *display;
664	Channel *c;
665	int i;
666
667	if (cctx == NULL)
668		fatal("%s: cctx == NULL", __func__);
669	if ((c = channel_lookup(id)) == NULL)
670		fatal("%s: no channel for id %d", __func__, id);
671
672	display = getenv("DISPLAY");
673	if (cctx->want_x_fwd && options.forward_x11 && display != NULL) {
674		char *proto, *data;
675		/* Get reasonable local authentication information. */
676		client_x11_get_proto(display, options.xauth_location,
677		    options.forward_x11_trusted, &proto, &data);
678		/* Request forwarding with authentication spoofing. */
679		debug("Requesting X11 forwarding with authentication spoofing.");
680		x11_request_forwarding_with_spoofing(id, display, proto, data);
681		/* XXX wait for reply */
682	}
683
684	if (cctx->want_agent_fwd && options.forward_agent) {
685		debug("Requesting authentication agent forwarding.");
686		channel_request_start(id, "auth-agent-req@openssh.com", 0);
687		packet_send();
688	}
689
690	client_session2_setup(id, cctx->want_tty, cctx->want_subsys,
691	    cctx->term, &cctx->tio, c->rfd, &cctx->cmd, cctx->env,
692	    client_subsystem_reply);
693
694	c->confirm_ctx = NULL;
695	buffer_free(&cctx->cmd);
696	xfree(cctx->term);
697	if (cctx->env != NULL) {
698		for (i = 0; cctx->env[i] != NULL; i++)
699			xfree(cctx->env[i]);
700		xfree(cctx->env);
701	}
702	xfree(cctx);
703}
704
705static void
706client_process_control(fd_set *readset)
707{
708	Buffer m;
709	Channel *c;
710	int client_fd, new_fd[3], ver, allowed;
711	socklen_t addrlen;
712	struct sockaddr_storage addr;
713	struct confirm_ctx *cctx;
714	char *cmd;
715	u_int i, len, env_len, command, flags;
716	uid_t euid;
717	gid_t egid;
718
719	/*
720	 * Accept connection on control socket
721	 */
722	if (control_fd == -1 || !FD_ISSET(control_fd, readset))
723		return;
724
725	memset(&addr, 0, sizeof(addr));
726	addrlen = sizeof(addr);
727	if ((client_fd = accept(control_fd,
728	    (struct sockaddr*)&addr, &addrlen)) == -1) {
729		error("%s accept: %s", __func__, strerror(errno));
730		return;
731	}
732
733	if (getpeereid(client_fd, &euid, &egid) < 0) {
734		error("%s getpeereid failed: %s", __func__, strerror(errno));
735		close(client_fd);
736		return;
737	}
738	if ((euid != 0) && (getuid() != euid)) {
739		error("control mode uid mismatch: peer euid %u != uid %u",
740		    (u_int) euid, (u_int) getuid());
741		close(client_fd);
742		return;
743	}
744
745	unset_nonblock(client_fd);
746
747	/* Read command */
748	buffer_init(&m);
749	if (ssh_msg_recv(client_fd, &m) == -1) {
750		error("%s: client msg_recv failed", __func__);
751		close(client_fd);
752		buffer_free(&m);
753		return;
754	}
755	if ((ver = buffer_get_char(&m)) != SSHMUX_VER) {
756		error("%s: wrong client version %d", __func__, ver);
757		buffer_free(&m);
758		close(client_fd);
759		return;
760	}
761
762	allowed = 1;
763	command = buffer_get_int(&m);
764	flags = buffer_get_int(&m);
765
766	buffer_clear(&m);
767
768	switch (command) {
769	case SSHMUX_COMMAND_OPEN:
770		if (options.control_master == SSHCTL_MASTER_ASK ||
771		    options.control_master == SSHCTL_MASTER_AUTO_ASK)
772			allowed = ask_permission("Allow shared connection "
773			    "to %s? ", host);
774		/* continue below */
775		break;
776	case SSHMUX_COMMAND_TERMINATE:
777		if (options.control_master == SSHCTL_MASTER_ASK ||
778		    options.control_master == SSHCTL_MASTER_AUTO_ASK)
779			allowed = ask_permission("Terminate shared connection "
780			    "to %s? ", host);
781		if (allowed)
782			quit_pending = 1;
783		/* FALLTHROUGH */
784	case SSHMUX_COMMAND_ALIVE_CHECK:
785		/* Reply for SSHMUX_COMMAND_TERMINATE and ALIVE_CHECK */
786		buffer_clear(&m);
787		buffer_put_int(&m, allowed);
788		buffer_put_int(&m, getpid());
789		if (ssh_msg_send(client_fd, SSHMUX_VER, &m) == -1) {
790			error("%s: client msg_send failed", __func__);
791			close(client_fd);
792			buffer_free(&m);
793			return;
794		}
795		buffer_free(&m);
796		close(client_fd);
797		return;
798	default:
799		error("Unsupported command %d", command);
800		buffer_free(&m);
801		close(client_fd);
802		return;
803	}
804
805	/* Reply for SSHMUX_COMMAND_OPEN */
806	buffer_clear(&m);
807	buffer_put_int(&m, allowed);
808	buffer_put_int(&m, getpid());
809	if (ssh_msg_send(client_fd, SSHMUX_VER, &m) == -1) {
810		error("%s: client msg_send failed", __func__);
811		close(client_fd);
812		buffer_free(&m);
813		return;
814	}
815
816	if (!allowed) {
817		error("Refused control connection");
818		close(client_fd);
819		buffer_free(&m);
820		return;
821	}
822
823	buffer_clear(&m);
824	if (ssh_msg_recv(client_fd, &m) == -1) {
825		error("%s: client msg_recv failed", __func__);
826		close(client_fd);
827		buffer_free(&m);
828		return;
829	}
830	if ((ver = buffer_get_char(&m)) != SSHMUX_VER) {
831		error("%s: wrong client version %d", __func__, ver);
832		buffer_free(&m);
833		close(client_fd);
834		return;
835	}
836
837	cctx = xcalloc(1, sizeof(*cctx));
838	cctx->want_tty = (flags & SSHMUX_FLAG_TTY) != 0;
839	cctx->want_subsys = (flags & SSHMUX_FLAG_SUBSYS) != 0;
840	cctx->want_x_fwd = (flags & SSHMUX_FLAG_X11_FWD) != 0;
841	cctx->want_agent_fwd = (flags & SSHMUX_FLAG_AGENT_FWD) != 0;
842	cctx->term = buffer_get_string(&m, &len);
843
844	cmd = buffer_get_string(&m, &len);
845	buffer_init(&cctx->cmd);
846	buffer_append(&cctx->cmd, cmd, strlen(cmd));
847
848	env_len = buffer_get_int(&m);
849	env_len = MIN(env_len, 4096);
850	debug3("%s: receiving %d env vars", __func__, env_len);
851	if (env_len != 0) {
852		cctx->env = xcalloc(env_len + 1, sizeof(*cctx->env));
853		for (i = 0; i < env_len; i++)
854			cctx->env[i] = buffer_get_string(&m, &len);
855		cctx->env[i] = NULL;
856	}
857
858	debug2("%s: accepted tty %d, subsys %d, cmd %s", __func__,
859	    cctx->want_tty, cctx->want_subsys, cmd);
860	xfree(cmd);
861
862	/* Gather fds from client */
863	new_fd[0] = mm_receive_fd(client_fd);
864	new_fd[1] = mm_receive_fd(client_fd);
865	new_fd[2] = mm_receive_fd(client_fd);
866
867	debug2("%s: got fds stdin %d, stdout %d, stderr %d", __func__,
868	    new_fd[0], new_fd[1], new_fd[2]);
869
870	/* Try to pick up ttymodes from client before it goes raw */
871	if (cctx->want_tty && tcgetattr(new_fd[0], &cctx->tio) == -1)
872		error("%s: tcgetattr: %s", __func__, strerror(errno));
873
874	/* This roundtrip is just for synchronisation of ttymodes */
875	buffer_clear(&m);
876	if (ssh_msg_send(client_fd, SSHMUX_VER, &m) == -1) {
877		error("%s: client msg_send failed", __func__);
878		close(client_fd);
879		close(new_fd[0]);
880		close(new_fd[1]);
881		close(new_fd[2]);
882		buffer_free(&m);
883		xfree(cctx->term);
884		if (env_len != 0) {
885			for (i = 0; i < env_len; i++)
886				xfree(cctx->env[i]);
887			xfree(cctx->env);
888		}
889		return;
890	}
891	buffer_free(&m);
892
893	/* enable nonblocking unless tty */
894	if (!isatty(new_fd[0]))
895		set_nonblock(new_fd[0]);
896	if (!isatty(new_fd[1]))
897		set_nonblock(new_fd[1]);
898	if (!isatty(new_fd[2]))
899		set_nonblock(new_fd[2]);
900
901	set_nonblock(client_fd);
902
903	c = channel_new("session", SSH_CHANNEL_OPENING,
904	    new_fd[0], new_fd[1], new_fd[2],
905	    CHAN_SES_WINDOW_DEFAULT, CHAN_SES_PACKET_DEFAULT,
906	    CHAN_EXTENDED_WRITE, "client-session", /*nonblock*/0);
907
908	/* XXX */
909	c->ctl_fd = client_fd;
910
911	debug3("%s: channel_new: %d", __func__, c->self);
912
913	channel_send_open(c->self);
914	channel_register_confirm(c->self, client_extra_session2_setup, cctx);
915}
916
917static void
918process_cmdline(void)
919{
920	void (*handler)(int);
921	char *s, *cmd, *cancel_host;
922	int delete = 0;
923	int local = 0;
924	u_short cancel_port;
925	Forward fwd;
926
927	leave_raw_mode();
928	handler = signal(SIGINT, SIG_IGN);
929	cmd = s = read_passphrase("\r\nssh> ", RP_ECHO);
930	if (s == NULL)
931		goto out;
932	while (*s && isspace(*s))
933		s++;
934	if (*s == '-')
935		s++;	/* Skip cmdline '-', if any */
936	if (*s == '\0')
937		goto out;
938
939	if (*s == 'h' || *s == 'H' || *s == '?') {
940		logit("Commands:");
941		logit("      -L[bind_address:]port:host:hostport    "
942		    "Request local forward");
943		logit("      -R[bind_address:]port:host:hostport    "
944		    "Request remote forward");
945		logit("      -KR[bind_address:]port                 "
946		    "Cancel remote forward");
947		if (!options.permit_local_command)
948			goto out;
949		logit("      !args                                  "
950		    "Execute local command");
951		goto out;
952	}
953
954	if (*s == '!' && options.permit_local_command) {
955		s++;
956		ssh_local_cmd(s);
957		goto out;
958	}
959
960	if (*s == 'K') {
961		delete = 1;
962		s++;
963	}
964	if (*s != 'L' && *s != 'R') {
965		logit("Invalid command.");
966		goto out;
967	}
968	if (*s == 'L')
969		local = 1;
970	if (local && delete) {
971		logit("Not supported.");
972		goto out;
973	}
974	if ((!local || delete) && !compat20) {
975		logit("Not supported for SSH protocol version 1.");
976		goto out;
977	}
978
979	s++;
980	while (*s && isspace(*s))
981		s++;
982
983	if (delete) {
984		cancel_port = 0;
985		cancel_host = hpdelim(&s);	/* may be NULL */
986		if (s != NULL) {
987			cancel_port = a2port(s);
988			cancel_host = cleanhostname(cancel_host);
989		} else {
990			cancel_port = a2port(cancel_host);
991			cancel_host = NULL;
992		}
993		if (cancel_port == 0) {
994			logit("Bad forwarding close port");
995			goto out;
996		}
997		channel_request_rforward_cancel(cancel_host, cancel_port);
998	} else {
999		if (!parse_forward(&fwd, s)) {
1000			logit("Bad forwarding specification.");
1001			goto out;
1002		}
1003		if (local) {
1004			if (channel_setup_local_fwd_listener(fwd.listen_host,
1005			    fwd.listen_port, fwd.connect_host,
1006			    fwd.connect_port, options.gateway_ports) < 0) {
1007				logit("Port forwarding failed.");
1008				goto out;
1009			}
1010		} else {
1011			if (channel_request_remote_forwarding(fwd.listen_host,
1012			    fwd.listen_port, fwd.connect_host,
1013			    fwd.connect_port) < 0) {
1014				logit("Port forwarding failed.");
1015				goto out;
1016			}
1017		}
1018
1019		logit("Forwarding port.");
1020	}
1021
1022out:
1023	signal(SIGINT, handler);
1024	enter_raw_mode();
1025	if (cmd)
1026		xfree(cmd);
1027}
1028
1029/* process the characters one by one */
1030static int
1031process_escapes(Buffer *bin, Buffer *bout, Buffer *berr, char *buf, int len)
1032{
1033	char string[1024];
1034	pid_t pid;
1035	int bytes = 0;
1036	u_int i;
1037	u_char ch;
1038	char *s;
1039
1040	if (len <= 0)
1041		return (0);
1042
1043	for (i = 0; i < (u_int)len; i++) {
1044		/* Get one character at a time. */
1045		ch = buf[i];
1046
1047		if (escape_pending) {
1048			/* We have previously seen an escape character. */
1049			/* Clear the flag now. */
1050			escape_pending = 0;
1051
1052			/* Process the escaped character. */
1053			switch (ch) {
1054			case '.':
1055				/* Terminate the connection. */
1056				snprintf(string, sizeof string, "%c.\r\n", escape_char);
1057				buffer_append(berr, string, strlen(string));
1058
1059				quit_pending = 1;
1060				return -1;
1061
1062			case 'Z' - 64:
1063				/* Suspend the program. */
1064				/* Print a message to that effect to the user. */
1065				snprintf(string, sizeof string, "%c^Z [suspend ssh]\r\n", escape_char);
1066				buffer_append(berr, string, strlen(string));
1067
1068				/* Restore terminal modes and suspend. */
1069				client_suspend_self(bin, bout, berr);
1070
1071				/* We have been continued. */
1072				continue;
1073
1074			case 'B':
1075				if (compat20) {
1076					snprintf(string, sizeof string,
1077					    "%cB\r\n", escape_char);
1078					buffer_append(berr, string,
1079					    strlen(string));
1080					channel_request_start(session_ident,
1081					    "break", 0);
1082					packet_put_int(1000);
1083					packet_send();
1084				}
1085				continue;
1086
1087			case 'R':
1088				if (compat20) {
1089					if (datafellows & SSH_BUG_NOREKEY)
1090						logit("Server does not support re-keying");
1091					else
1092						need_rekeying = 1;
1093				}
1094				continue;
1095
1096			case '&':
1097				/*
1098				 * Detach the program (continue to serve connections,
1099				 * but put in background and no more new connections).
1100				 */
1101				/* Restore tty modes. */
1102				leave_raw_mode();
1103
1104				/* Stop listening for new connections. */
1105				channel_stop_listening();
1106
1107				snprintf(string, sizeof string,
1108				    "%c& [backgrounded]\n", escape_char);
1109				buffer_append(berr, string, strlen(string));
1110
1111				/* Fork into background. */
1112				pid = fork();
1113				if (pid < 0) {
1114					error("fork: %.100s", strerror(errno));
1115					continue;
1116				}
1117				if (pid != 0) {	/* This is the parent. */
1118					/* The parent just exits. */
1119					exit(0);
1120				}
1121				/* The child continues serving connections. */
1122				if (compat20) {
1123					buffer_append(bin, "\004", 1);
1124					/* fake EOF on stdin */
1125					return -1;
1126				} else if (!stdin_eof) {
1127					/*
1128					 * Sending SSH_CMSG_EOF alone does not always appear
1129					 * to be enough.  So we try to send an EOF character
1130					 * first.
1131					 */
1132					packet_start(SSH_CMSG_STDIN_DATA);
1133					packet_put_string("\004", 1);
1134					packet_send();
1135					/* Close stdin. */
1136					stdin_eof = 1;
1137					if (buffer_len(bin) == 0) {
1138						packet_start(SSH_CMSG_EOF);
1139						packet_send();
1140					}
1141				}
1142				continue;
1143
1144			case '?':
1145				snprintf(string, sizeof string,
1146"%c?\r\n\
1147Supported escape sequences:\r\n\
1148%c.  - terminate connection\r\n\
1149%cB  - send a BREAK to the remote system\r\n\
1150%cC  - open a command line\r\n\
1151%cR  - Request rekey (SSH protocol 2 only)\r\n\
1152%c^Z - suspend ssh\r\n\
1153%c#  - list forwarded connections\r\n\
1154%c&  - background ssh (when waiting for connections to terminate)\r\n\
1155%c?  - this message\r\n\
1156%c%c  - send the escape character by typing it twice\r\n\
1157(Note that escapes are only recognized immediately after newline.)\r\n",
1158				    escape_char, escape_char, escape_char, escape_char,
1159				    escape_char, escape_char, escape_char, escape_char,
1160				    escape_char, escape_char, escape_char);
1161				buffer_append(berr, string, strlen(string));
1162				continue;
1163
1164			case '#':
1165				snprintf(string, sizeof string, "%c#\r\n", escape_char);
1166				buffer_append(berr, string, strlen(string));
1167				s = channel_open_message();
1168				buffer_append(berr, s, strlen(s));
1169				xfree(s);
1170				continue;
1171
1172			case 'C':
1173				process_cmdline();
1174				continue;
1175
1176			default:
1177				if (ch != escape_char) {
1178					buffer_put_char(bin, escape_char);
1179					bytes++;
1180				}
1181				/* Escaped characters fall through here */
1182				break;
1183			}
1184		} else {
1185			/*
1186			 * The previous character was not an escape char. Check if this
1187			 * is an escape.
1188			 */
1189			if (last_was_cr && ch == escape_char) {
1190				/* It is. Set the flag and continue to next character. */
1191				escape_pending = 1;
1192				continue;
1193			}
1194		}
1195
1196		/*
1197		 * Normal character.  Record whether it was a newline,
1198		 * and append it to the buffer.
1199		 */
1200		last_was_cr = (ch == '\r' || ch == '\n');
1201		buffer_put_char(bin, ch);
1202		bytes++;
1203	}
1204	return bytes;
1205}
1206
1207static void
1208client_process_input(fd_set *readset)
1209{
1210	int len;
1211	char buf[8192];
1212
1213	/* Read input from stdin. */
1214	if (FD_ISSET(fileno(stdin), readset)) {
1215		/* Read as much as possible. */
1216		len = read(fileno(stdin), buf, sizeof(buf));
1217		if (len < 0 && (errno == EAGAIN || errno == EINTR))
1218			return;		/* we'll try again later */
1219		if (len <= 0) {
1220			/*
1221			 * Received EOF or error.  They are treated
1222			 * similarly, except that an error message is printed
1223			 * if it was an error condition.
1224			 */
1225			if (len < 0) {
1226				snprintf(buf, sizeof buf, "read: %.100s\r\n", strerror(errno));
1227				buffer_append(&stderr_buffer, buf, strlen(buf));
1228			}
1229			/* Mark that we have seen EOF. */
1230			stdin_eof = 1;
1231			/*
1232			 * Send an EOF message to the server unless there is
1233			 * data in the buffer.  If there is data in the
1234			 * buffer, no message will be sent now.  Code
1235			 * elsewhere will send the EOF when the buffer
1236			 * becomes empty if stdin_eof is set.
1237			 */
1238			if (buffer_len(&stdin_buffer) == 0) {
1239				packet_start(SSH_CMSG_EOF);
1240				packet_send();
1241			}
1242		} else if (escape_char == SSH_ESCAPECHAR_NONE) {
1243			/*
1244			 * Normal successful read, and no escape character.
1245			 * Just append the data to buffer.
1246			 */
1247			buffer_append(&stdin_buffer, buf, len);
1248		} else {
1249			/*
1250			 * Normal, successful read.  But we have an escape character
1251			 * and have to process the characters one by one.
1252			 */
1253			if (process_escapes(&stdin_buffer, &stdout_buffer,
1254			    &stderr_buffer, buf, len) == -1)
1255				return;
1256		}
1257	}
1258}
1259
1260static void
1261client_process_output(fd_set *writeset)
1262{
1263	int len;
1264	char buf[100];
1265
1266	/* Write buffered output to stdout. */
1267	if (FD_ISSET(fileno(stdout), writeset)) {
1268		/* Write as much data as possible. */
1269		len = write(fileno(stdout), buffer_ptr(&stdout_buffer),
1270		    buffer_len(&stdout_buffer));
1271		if (len <= 0) {
1272			if (errno == EINTR || errno == EAGAIN)
1273				len = 0;
1274			else {
1275				/*
1276				 * An error or EOF was encountered.  Put an
1277				 * error message to stderr buffer.
1278				 */
1279				snprintf(buf, sizeof buf, "write stdout: %.50s\r\n", strerror(errno));
1280				buffer_append(&stderr_buffer, buf, strlen(buf));
1281				quit_pending = 1;
1282				return;
1283			}
1284		}
1285		/* Consume printed data from the buffer. */
1286		buffer_consume(&stdout_buffer, len);
1287		stdout_bytes += len;
1288	}
1289	/* Write buffered output to stderr. */
1290	if (FD_ISSET(fileno(stderr), writeset)) {
1291		/* Write as much data as possible. */
1292		len = write(fileno(stderr), buffer_ptr(&stderr_buffer),
1293		    buffer_len(&stderr_buffer));
1294		if (len <= 0) {
1295			if (errno == EINTR || errno == EAGAIN)
1296				len = 0;
1297			else {
1298				/* EOF or error, but can't even print error message. */
1299				quit_pending = 1;
1300				return;
1301			}
1302		}
1303		/* Consume printed characters from the buffer. */
1304		buffer_consume(&stderr_buffer, len);
1305		stderr_bytes += len;
1306	}
1307}
1308
1309/*
1310 * Get packets from the connection input buffer, and process them as long as
1311 * there are packets available.
1312 *
1313 * Any unknown packets received during the actual
1314 * session cause the session to terminate.  This is
1315 * intended to make debugging easier since no
1316 * confirmations are sent.  Any compatible protocol
1317 * extensions must be negotiated during the
1318 * preparatory phase.
1319 */
1320
1321static void
1322client_process_buffered_input_packets(void)
1323{
1324	dispatch_run(DISPATCH_NONBLOCK, &quit_pending, compat20 ? xxx_kex : NULL);
1325}
1326
1327/* scan buf[] for '~' before sending data to the peer */
1328
1329static int
1330simple_escape_filter(Channel *c, char *buf, int len)
1331{
1332	/* XXX we assume c->extended is writeable */
1333	return process_escapes(&c->input, &c->output, &c->extended, buf, len);
1334}
1335
1336static void
1337client_channel_closed(int id, void *arg)
1338{
1339	channel_cancel_cleanup(id);
1340	session_closed = 1;
1341	leave_raw_mode();
1342}
1343
1344/*
1345 * Implements the interactive session with the server.  This is called after
1346 * the user has been authenticated, and a command has been started on the
1347 * remote host.  If escape_char != SSH_ESCAPECHAR_NONE, it is the character
1348 * used as an escape character for terminating or suspending the session.
1349 */
1350
1351int
1352client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
1353{
1354	fd_set *readset = NULL, *writeset = NULL;
1355	double start_time, total_time;
1356	int max_fd = 0, max_fd2 = 0, len, rekeying = 0;
1357	u_int nalloc = 0;
1358	char buf[100];
1359
1360	debug("Entering interactive session.");
1361
1362	start_time = get_current_time();
1363
1364	/* Initialize variables. */
1365	escape_pending = 0;
1366	last_was_cr = 1;
1367	exit_status = -1;
1368	stdin_eof = 0;
1369	buffer_high = 64 * 1024;
1370	connection_in = packet_get_connection_in();
1371	connection_out = packet_get_connection_out();
1372	max_fd = MAX(connection_in, connection_out);
1373	if (control_fd != -1)
1374		max_fd = MAX(max_fd, control_fd);
1375
1376	if (!compat20) {
1377		/* enable nonblocking unless tty */
1378		if (!isatty(fileno(stdin)))
1379			set_nonblock(fileno(stdin));
1380		if (!isatty(fileno(stdout)))
1381			set_nonblock(fileno(stdout));
1382		if (!isatty(fileno(stderr)))
1383			set_nonblock(fileno(stderr));
1384		max_fd = MAX(max_fd, fileno(stdin));
1385		max_fd = MAX(max_fd, fileno(stdout));
1386		max_fd = MAX(max_fd, fileno(stderr));
1387	}
1388	stdin_bytes = 0;
1389	stdout_bytes = 0;
1390	stderr_bytes = 0;
1391	quit_pending = 0;
1392	escape_char = escape_char_arg;
1393
1394	/* Initialize buffers. */
1395	buffer_init(&stdin_buffer);
1396	buffer_init(&stdout_buffer);
1397	buffer_init(&stderr_buffer);
1398
1399	client_init_dispatch();
1400
1401	/*
1402	 * Set signal handlers, (e.g. to restore non-blocking mode)
1403	 * but don't overwrite SIG_IGN, matches behaviour from rsh(1)
1404	 */
1405	if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
1406		signal(SIGHUP, signal_handler);
1407	if (signal(SIGINT, SIG_IGN) != SIG_IGN)
1408		signal(SIGINT, signal_handler);
1409	if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)
1410		signal(SIGQUIT, signal_handler);
1411	if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
1412		signal(SIGTERM, signal_handler);
1413	signal(SIGWINCH, window_change_handler);
1414
1415	if (have_pty)
1416		enter_raw_mode();
1417
1418	if (compat20) {
1419		session_ident = ssh2_chan_id;
1420		if (escape_char != SSH_ESCAPECHAR_NONE)
1421			channel_register_filter(session_ident,
1422			    simple_escape_filter, NULL);
1423		if (session_ident != -1)
1424			channel_register_cleanup(session_ident,
1425			    client_channel_closed, 0);
1426	} else {
1427		/* Check if we should immediately send eof on stdin. */
1428		client_check_initial_eof_on_stdin();
1429	}
1430
1431	/* Main loop of the client for the interactive session mode. */
1432	while (!quit_pending) {
1433
1434		/* Process buffered packets sent by the server. */
1435		client_process_buffered_input_packets();
1436
1437		if (compat20 && session_closed && !channel_still_open())
1438			break;
1439
1440		rekeying = (xxx_kex != NULL && !xxx_kex->done);
1441
1442		if (rekeying) {
1443			debug("rekeying in progress");
1444		} else {
1445			/*
1446			 * Make packets of buffered stdin data, and buffer
1447			 * them for sending to the server.
1448			 */
1449			if (!compat20)
1450				client_make_packets_from_stdin_data();
1451
1452			/*
1453			 * Make packets from buffered channel data, and
1454			 * enqueue them for sending to the server.
1455			 */
1456			if (packet_not_very_much_data_to_write())
1457				channel_output_poll();
1458
1459			/*
1460			 * Check if the window size has changed, and buffer a
1461			 * message about it to the server if so.
1462			 */
1463			client_check_window_change();
1464
1465			if (quit_pending)
1466				break;
1467		}
1468		/*
1469		 * Wait until we have something to do (something becomes
1470		 * available on one of the descriptors).
1471		 */
1472		max_fd2 = max_fd;
1473		client_wait_until_can_do_something(&readset, &writeset,
1474		    &max_fd2, &nalloc, rekeying);
1475
1476		if (quit_pending)
1477			break;
1478
1479		/* Do channel operations unless rekeying in progress. */
1480		if (!rekeying) {
1481			channel_after_select(readset, writeset);
1482			if (need_rekeying || packet_need_rekeying()) {
1483				debug("need rekeying");
1484				xxx_kex->done = 0;
1485				kex_send_kexinit(xxx_kex);
1486				need_rekeying = 0;
1487			}
1488		}
1489
1490		/* Buffer input from the connection.  */
1491		client_process_net_input(readset);
1492
1493		/* Accept control connections.  */
1494		client_process_control(readset);
1495
1496		if (quit_pending)
1497			break;
1498
1499		if (!compat20) {
1500			/* Buffer data from stdin */
1501			client_process_input(readset);
1502			/*
1503			 * Process output to stdout and stderr.  Output to
1504			 * the connection is processed elsewhere (above).
1505			 */
1506			client_process_output(writeset);
1507		}
1508
1509		/* Send as much buffered packet data as possible to the sender. */
1510		if (FD_ISSET(connection_out, writeset))
1511			packet_write_poll();
1512	}
1513	if (readset)
1514		xfree(readset);
1515	if (writeset)
1516		xfree(writeset);
1517
1518	/* Terminate the session. */
1519
1520	/* Stop watching for window change. */
1521	signal(SIGWINCH, SIG_DFL);
1522
1523	channel_free_all();
1524
1525	if (have_pty)
1526		leave_raw_mode();
1527
1528	/* restore blocking io */
1529	if (!isatty(fileno(stdin)))
1530		unset_nonblock(fileno(stdin));
1531	if (!isatty(fileno(stdout)))
1532		unset_nonblock(fileno(stdout));
1533	if (!isatty(fileno(stderr)))
1534		unset_nonblock(fileno(stderr));
1535
1536	/*
1537	 * If there was no shell or command requested, there will be no remote
1538	 * exit status to be returned.  In that case, clear error code if the
1539	 * connection was deliberately terminated at this end.
1540	 */
1541	if (no_shell_flag && received_signal == SIGTERM) {
1542		received_signal = 0;
1543		exit_status = 0;
1544	}
1545
1546	if (received_signal)
1547		fatal("Killed by signal %d.", (int) received_signal);
1548
1549	/*
1550	 * In interactive mode (with pseudo tty) display a message indicating
1551	 * that the connection has been closed.
1552	 */
1553	if (have_pty && options.log_level != SYSLOG_LEVEL_QUIET) {
1554		snprintf(buf, sizeof buf, "Connection to %.64s closed.\r\n", host);
1555		buffer_append(&stderr_buffer, buf, strlen(buf));
1556	}
1557
1558	/* Output any buffered data for stdout. */
1559	while (buffer_len(&stdout_buffer) > 0) {
1560		len = write(fileno(stdout), buffer_ptr(&stdout_buffer),
1561		    buffer_len(&stdout_buffer));
1562		if (len <= 0) {
1563			error("Write failed flushing stdout buffer.");
1564			break;
1565		}
1566		buffer_consume(&stdout_buffer, len);
1567		stdout_bytes += len;
1568	}
1569
1570	/* Output any buffered data for stderr. */
1571	while (buffer_len(&stderr_buffer) > 0) {
1572		len = write(fileno(stderr), buffer_ptr(&stderr_buffer),
1573		    buffer_len(&stderr_buffer));
1574		if (len <= 0) {
1575			error("Write failed flushing stderr buffer.");
1576			break;
1577		}
1578		buffer_consume(&stderr_buffer, len);
1579		stderr_bytes += len;
1580	}
1581
1582	/* Clear and free any buffers. */
1583	memset(buf, 0, sizeof(buf));
1584	buffer_free(&stdin_buffer);
1585	buffer_free(&stdout_buffer);
1586	buffer_free(&stderr_buffer);
1587
1588	/* Report bytes transferred, and transfer rates. */
1589	total_time = get_current_time() - start_time;
1590	debug("Transferred: stdin %lu, stdout %lu, stderr %lu bytes in %.1f seconds",
1591	    stdin_bytes, stdout_bytes, stderr_bytes, total_time);
1592	if (total_time > 0)
1593		debug("Bytes per second: stdin %.1f, stdout %.1f, stderr %.1f",
1594		    stdin_bytes / total_time, stdout_bytes / total_time,
1595		    stderr_bytes / total_time);
1596
1597	/* Return the exit status of the program. */
1598	debug("Exit status %d", exit_status);
1599	return exit_status;
1600}
1601
1602/*********/
1603
1604static void
1605client_input_stdout_data(int type, u_int32_t seq, void *ctxt)
1606{
1607	u_int data_len;
1608	char *data = packet_get_string(&data_len);
1609	packet_check_eom();
1610	buffer_append(&stdout_buffer, data, data_len);
1611	memset(data, 0, data_len);
1612	xfree(data);
1613}
1614static void
1615client_input_stderr_data(int type, u_int32_t seq, void *ctxt)
1616{
1617	u_int data_len;
1618	char *data = packet_get_string(&data_len);
1619	packet_check_eom();
1620	buffer_append(&stderr_buffer, data, data_len);
1621	memset(data, 0, data_len);
1622	xfree(data);
1623}
1624static void
1625client_input_exit_status(int type, u_int32_t seq, void *ctxt)
1626{
1627	exit_status = packet_get_int();
1628	packet_check_eom();
1629	/* Acknowledge the exit. */
1630	packet_start(SSH_CMSG_EXIT_CONFIRMATION);
1631	packet_send();
1632	/*
1633	 * Must wait for packet to be sent since we are
1634	 * exiting the loop.
1635	 */
1636	packet_write_wait();
1637	/* Flag that we want to exit. */
1638	quit_pending = 1;
1639}
1640static void
1641client_input_agent_open(int type, u_int32_t seq, void *ctxt)
1642{
1643	Channel *c = NULL;
1644	int remote_id, sock;
1645
1646	/* Read the remote channel number from the message. */
1647	remote_id = packet_get_int();
1648	packet_check_eom();
1649
1650	/*
1651	 * Get a connection to the local authentication agent (this may again
1652	 * get forwarded).
1653	 */
1654	sock = ssh_get_authentication_socket();
1655
1656	/*
1657	 * If we could not connect the agent, send an error message back to
1658	 * the server. This should never happen unless the agent dies,
1659	 * because authentication forwarding is only enabled if we have an
1660	 * agent.
1661	 */
1662	if (sock >= 0) {
1663		c = channel_new("", SSH_CHANNEL_OPEN, sock, sock,
1664		    -1, 0, 0, 0, "authentication agent connection", 1);
1665		c->remote_id = remote_id;
1666		c->force_drain = 1;
1667	}
1668	if (c == NULL) {
1669		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
1670		packet_put_int(remote_id);
1671	} else {
1672		/* Send a confirmation to the remote host. */
1673		debug("Forwarding authentication connection.");
1674		packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
1675		packet_put_int(remote_id);
1676		packet_put_int(c->self);
1677	}
1678	packet_send();
1679}
1680
1681static Channel *
1682client_request_forwarded_tcpip(const char *request_type, int rchan)
1683{
1684	Channel *c = NULL;
1685	char *listen_address, *originator_address;
1686	int listen_port, originator_port;
1687	int sock;
1688
1689	/* Get rest of the packet */
1690	listen_address = packet_get_string(NULL);
1691	listen_port = packet_get_int();
1692	originator_address = packet_get_string(NULL);
1693	originator_port = packet_get_int();
1694	packet_check_eom();
1695
1696	debug("client_request_forwarded_tcpip: listen %s port %d, originator %s port %d",
1697	    listen_address, listen_port, originator_address, originator_port);
1698
1699	sock = channel_connect_by_listen_address(listen_port);
1700	if (sock < 0) {
1701		xfree(originator_address);
1702		xfree(listen_address);
1703		return NULL;
1704	}
1705	c = channel_new("forwarded-tcpip",
1706	    SSH_CHANNEL_CONNECTING, sock, sock, -1,
1707	    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_WINDOW_DEFAULT, 0,
1708	    originator_address, 1);
1709	xfree(originator_address);
1710	xfree(listen_address);
1711	return c;
1712}
1713
1714static Channel *
1715client_request_x11(const char *request_type, int rchan)
1716{
1717	Channel *c = NULL;
1718	char *originator;
1719	int originator_port;
1720	int sock;
1721
1722	if (!options.forward_x11) {
1723		error("Warning: ssh server tried X11 forwarding.");
1724		error("Warning: this is probably a break-in attempt by a malicious server.");
1725		return NULL;
1726	}
1727	originator = packet_get_string(NULL);
1728	if (datafellows & SSH_BUG_X11FWD) {
1729		debug2("buggy server: x11 request w/o originator_port");
1730		originator_port = 0;
1731	} else {
1732		originator_port = packet_get_int();
1733	}
1734	packet_check_eom();
1735	/* XXX check permission */
1736	debug("client_request_x11: request from %s %d", originator,
1737	    originator_port);
1738	xfree(originator);
1739	sock = x11_connect_display();
1740	if (sock < 0)
1741		return NULL;
1742	c = channel_new("x11",
1743	    SSH_CHANNEL_X11_OPEN, sock, sock, -1,
1744	    CHAN_TCP_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, 0, "x11", 1);
1745	c->force_drain = 1;
1746	return c;
1747}
1748
1749static Channel *
1750client_request_agent(const char *request_type, int rchan)
1751{
1752	Channel *c = NULL;
1753	int sock;
1754
1755	if (!options.forward_agent) {
1756		error("Warning: ssh server tried agent forwarding.");
1757		error("Warning: this is probably a break-in attempt by a malicious server.");
1758		return NULL;
1759	}
1760	sock =  ssh_get_authentication_socket();
1761	if (sock < 0)
1762		return NULL;
1763	c = channel_new("authentication agent connection",
1764	    SSH_CHANNEL_OPEN, sock, sock, -1,
1765	    CHAN_X11_WINDOW_DEFAULT, CHAN_TCP_WINDOW_DEFAULT, 0,
1766	    "authentication agent connection", 1);
1767	c->force_drain = 1;
1768	return c;
1769}
1770
1771/* XXXX move to generic input handler */
1772static void
1773client_input_channel_open(int type, u_int32_t seq, void *ctxt)
1774{
1775	Channel *c = NULL;
1776	char *ctype;
1777	int rchan;
1778	u_int rmaxpack, rwindow, len;
1779
1780	ctype = packet_get_string(&len);
1781	rchan = packet_get_int();
1782	rwindow = packet_get_int();
1783	rmaxpack = packet_get_int();
1784
1785	debug("client_input_channel_open: ctype %s rchan %d win %d max %d",
1786	    ctype, rchan, rwindow, rmaxpack);
1787
1788	if (strcmp(ctype, "forwarded-tcpip") == 0) {
1789		c = client_request_forwarded_tcpip(ctype, rchan);
1790	} else if (strcmp(ctype, "x11") == 0) {
1791		c = client_request_x11(ctype, rchan);
1792	} else if (strcmp(ctype, "auth-agent@openssh.com") == 0) {
1793		c = client_request_agent(ctype, rchan);
1794	}
1795/* XXX duplicate : */
1796	if (c != NULL) {
1797		debug("confirm %s", ctype);
1798		c->remote_id = rchan;
1799		c->remote_window = rwindow;
1800		c->remote_maxpacket = rmaxpack;
1801		if (c->type != SSH_CHANNEL_CONNECTING) {
1802			packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
1803			packet_put_int(c->remote_id);
1804			packet_put_int(c->self);
1805			packet_put_int(c->local_window);
1806			packet_put_int(c->local_maxpacket);
1807			packet_send();
1808		}
1809	} else {
1810		debug("failure %s", ctype);
1811		packet_start(SSH2_MSG_CHANNEL_OPEN_FAILURE);
1812		packet_put_int(rchan);
1813		packet_put_int(SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED);
1814		if (!(datafellows & SSH_BUG_OPENFAILURE)) {
1815			packet_put_cstring("open failed");
1816			packet_put_cstring("");
1817		}
1818		packet_send();
1819	}
1820	xfree(ctype);
1821}
1822static void
1823client_input_channel_req(int type, u_int32_t seq, void *ctxt)
1824{
1825	Channel *c = NULL;
1826	int exitval, id, reply, success = 0;
1827	char *rtype;
1828
1829	id = packet_get_int();
1830	rtype = packet_get_string(NULL);
1831	reply = packet_get_char();
1832
1833	debug("client_input_channel_req: channel %d rtype %s reply %d",
1834	    id, rtype, reply);
1835
1836	if (id == -1) {
1837		error("client_input_channel_req: request for channel -1");
1838	} else if ((c = channel_lookup(id)) == NULL) {
1839		error("client_input_channel_req: channel %d: unknown channel", id);
1840	} else if (strcmp(rtype, "exit-status") == 0) {
1841		exitval = packet_get_int();
1842		if (id == session_ident) {
1843			success = 1;
1844			exit_status = exitval;
1845		} else if (c->ctl_fd == -1) {
1846			error("client_input_channel_req: unexpected channel %d",
1847			    session_ident);
1848		} else {
1849			atomicio(vwrite, c->ctl_fd, &exitval, sizeof(exitval));
1850			success = 1;
1851		}
1852		packet_check_eom();
1853	}
1854	if (reply) {
1855		packet_start(success ?
1856		    SSH2_MSG_CHANNEL_SUCCESS : SSH2_MSG_CHANNEL_FAILURE);
1857		packet_put_int(id);
1858		packet_send();
1859	}
1860	xfree(rtype);
1861}
1862static void
1863client_input_global_request(int type, u_int32_t seq, void *ctxt)
1864{
1865	char *rtype;
1866	int want_reply;
1867	int success = 0;
1868
1869	rtype = packet_get_string(NULL);
1870	want_reply = packet_get_char();
1871	debug("client_input_global_request: rtype %s want_reply %d",
1872	    rtype, want_reply);
1873	if (want_reply) {
1874		packet_start(success ?
1875		    SSH2_MSG_REQUEST_SUCCESS : SSH2_MSG_REQUEST_FAILURE);
1876		packet_send();
1877		packet_write_wait();
1878	}
1879	xfree(rtype);
1880}
1881
1882void
1883client_session2_setup(int id, int want_tty, int want_subsystem,
1884    const char *term, struct termios *tiop, int in_fd, Buffer *cmd, char **env,
1885    dispatch_fn *subsys_repl)
1886{
1887	int len;
1888	Channel *c = NULL;
1889
1890	debug2("%s: id %d", __func__, id);
1891
1892	if ((c = channel_lookup(id)) == NULL)
1893		fatal("client_session2_setup: channel %d: unknown channel", id);
1894
1895	if (want_tty) {
1896		struct winsize ws;
1897		struct termios tio;
1898
1899		/* Store window size in the packet. */
1900		if (ioctl(in_fd, TIOCGWINSZ, &ws) < 0)
1901			memset(&ws, 0, sizeof(ws));
1902
1903		channel_request_start(id, "pty-req", 0);
1904		packet_put_cstring(term != NULL ? term : "");
1905		packet_put_int((u_int)ws.ws_col);
1906		packet_put_int((u_int)ws.ws_row);
1907		packet_put_int((u_int)ws.ws_xpixel);
1908		packet_put_int((u_int)ws.ws_ypixel);
1909		tio = get_saved_tio();
1910		tty_make_modes(-1, tiop != NULL ? tiop : &tio);
1911		packet_send();
1912		/* XXX wait for reply */
1913		c->client_tty = 1;
1914	}
1915
1916	/* Transfer any environment variables from client to server */
1917	if (options.num_send_env != 0 && env != NULL) {
1918		int i, j, matched;
1919		char *name, *val;
1920
1921		debug("Sending environment.");
1922		for (i = 0; env[i] != NULL; i++) {
1923			/* Split */
1924			name = xstrdup(env[i]);
1925			if ((val = strchr(name, '=')) == NULL) {
1926				xfree(name);
1927				continue;
1928			}
1929			*val++ = '\0';
1930
1931			matched = 0;
1932			for (j = 0; j < options.num_send_env; j++) {
1933				if (match_pattern(name, options.send_env[j])) {
1934					matched = 1;
1935					break;
1936				}
1937			}
1938			if (!matched) {
1939				debug3("Ignored env %s", name);
1940				xfree(name);
1941				continue;
1942			}
1943
1944			debug("Sending env %s = %s", name, val);
1945			channel_request_start(id, "env", 0);
1946			packet_put_cstring(name);
1947			packet_put_cstring(val);
1948			packet_send();
1949			xfree(name);
1950		}
1951	}
1952
1953	len = buffer_len(cmd);
1954	if (len > 0) {
1955		if (len > 900)
1956			len = 900;
1957		if (want_subsystem) {
1958			debug("Sending subsystem: %.*s", len, (u_char*)buffer_ptr(cmd));
1959			channel_request_start(id, "subsystem", subsys_repl != NULL);
1960			if (subsys_repl != NULL) {
1961				/* register callback for reply */
1962				/* XXX we assume that client_loop has already been called */
1963				dispatch_set(SSH2_MSG_CHANNEL_FAILURE, subsys_repl);
1964				dispatch_set(SSH2_MSG_CHANNEL_SUCCESS, subsys_repl);
1965			}
1966		} else {
1967			debug("Sending command: %.*s", len, (u_char*)buffer_ptr(cmd));
1968			channel_request_start(id, "exec", 0);
1969		}
1970		packet_put_string(buffer_ptr(cmd), buffer_len(cmd));
1971		packet_send();
1972	} else {
1973		channel_request_start(id, "shell", 0);
1974		packet_send();
1975	}
1976}
1977
1978static void
1979client_init_dispatch_20(void)
1980{
1981	dispatch_init(&dispatch_protocol_error);
1982
1983	dispatch_set(SSH2_MSG_CHANNEL_CLOSE, &channel_input_oclose);
1984	dispatch_set(SSH2_MSG_CHANNEL_DATA, &channel_input_data);
1985	dispatch_set(SSH2_MSG_CHANNEL_EOF, &channel_input_ieof);
1986	dispatch_set(SSH2_MSG_CHANNEL_EXTENDED_DATA, &channel_input_extended_data);
1987	dispatch_set(SSH2_MSG_CHANNEL_OPEN, &client_input_channel_open);
1988	dispatch_set(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, &channel_input_open_confirmation);
1989	dispatch_set(SSH2_MSG_CHANNEL_OPEN_FAILURE, &channel_input_open_failure);
1990	dispatch_set(SSH2_MSG_CHANNEL_REQUEST, &client_input_channel_req);
1991	dispatch_set(SSH2_MSG_CHANNEL_WINDOW_ADJUST, &channel_input_window_adjust);
1992	dispatch_set(SSH2_MSG_GLOBAL_REQUEST, &client_input_global_request);
1993
1994	/* rekeying */
1995	dispatch_set(SSH2_MSG_KEXINIT, &kex_input_kexinit);
1996
1997	/* global request reply messages */
1998	dispatch_set(SSH2_MSG_REQUEST_FAILURE, &client_global_request_reply);
1999	dispatch_set(SSH2_MSG_REQUEST_SUCCESS, &client_global_request_reply);
2000}
2001static void
2002client_init_dispatch_13(void)
2003{
2004	dispatch_init(NULL);
2005	dispatch_set(SSH_MSG_CHANNEL_CLOSE, &channel_input_close);
2006	dispatch_set(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION, &channel_input_close_confirmation);
2007	dispatch_set(SSH_MSG_CHANNEL_DATA, &channel_input_data);
2008	dispatch_set(SSH_MSG_CHANNEL_OPEN_CONFIRMATION, &channel_input_open_confirmation);
2009	dispatch_set(SSH_MSG_CHANNEL_OPEN_FAILURE, &channel_input_open_failure);
2010	dispatch_set(SSH_MSG_PORT_OPEN, &channel_input_port_open);
2011	dispatch_set(SSH_SMSG_EXITSTATUS, &client_input_exit_status);
2012	dispatch_set(SSH_SMSG_STDERR_DATA, &client_input_stderr_data);
2013	dispatch_set(SSH_SMSG_STDOUT_DATA, &client_input_stdout_data);
2014
2015	dispatch_set(SSH_SMSG_AGENT_OPEN, options.forward_agent ?
2016	    &client_input_agent_open : &deny_input_open);
2017	dispatch_set(SSH_SMSG_X11_OPEN, options.forward_x11 ?
2018	    &x11_input_open : &deny_input_open);
2019}
2020static void
2021client_init_dispatch_15(void)
2022{
2023	client_init_dispatch_13();
2024	dispatch_set(SSH_MSG_CHANNEL_CLOSE, &channel_input_ieof);
2025	dispatch_set(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION, & channel_input_oclose);
2026}
2027static void
2028client_init_dispatch(void)
2029{
2030	if (compat20)
2031		client_init_dispatch_20();
2032	else if (compat13)
2033		client_init_dispatch_13();
2034	else
2035		client_init_dispatch_15();
2036}
2037
2038/* client specific fatal cleanup */
2039void
2040cleanup_exit(int i)
2041{
2042	leave_raw_mode();
2043	leave_non_blocking();
2044	if (options.control_path != NULL && control_fd != -1)
2045		unlink(options.control_path);
2046	_exit(i);
2047}
2048