]> andersk Git - openssh.git/blob - channels.c
- dtucker@cvs.openbsd.org 2006/08/01 11:34:36
[openssh.git] / channels.c
1 /* $OpenBSD: channels.c,v 1.262 2006/07/26 13:57:17 stevesk 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  * This file contains functions for generic socket connection forwarding.
7  * There is also code for initiating connection forwarding for X11 connections,
8  * arbitrary tcp/ip connections, and the authentication agent connection.
9  *
10  * As far as I am concerned, the code I have written for this software
11  * can be used freely for any purpose.  Any derived versions of this
12  * software must be clearly marked as such, and if the derived work is
13  * incompatible with the protocol description in the RFC file, it must be
14  * called by a name other than "ssh" or "Secure Shell".
15  *
16  * SSH2 support added by Markus Friedl.
17  * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl.  All rights reserved.
18  * Copyright (c) 1999 Dug Song.  All rights reserved.
19  * Copyright (c) 1999 Theo de Raadt.  All rights reserved.
20  *
21  * Redistribution and use in source and binary forms, with or without
22  * modification, are permitted provided that the following conditions
23  * are met:
24  * 1. Redistributions of source code must retain the above copyright
25  *    notice, this list of conditions and the following disclaimer.
26  * 2. Redistributions in binary form must reproduce the above copyright
27  *    notice, this list of conditions and the following disclaimer in the
28  *    documentation and/or other materials provided with the distribution.
29  *
30  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
31  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
32  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
33  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
34  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
35  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
39  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40  */
41
42 #include "includes.h"
43
44 #include <sys/ioctl.h>
45 #include <sys/types.h>
46 #include <sys/un.h>
47 #include <sys/socket.h>
48 #ifdef HAVE_SYS_TIME_H
49 # include <sys/time.h>
50 #endif
51
52 #include <netinet/in.h>
53 #include <arpa/inet.h>
54
55 #include <errno.h>
56 #include <netdb.h>
57 #include <stdlib.h>
58 #include <string.h>
59 #include <termios.h>
60 #include <unistd.h>
61
62 #include "ssh.h"
63 #include "ssh1.h"
64 #include "ssh2.h"
65 #include "packet.h"
66 #include "xmalloc.h"
67 #include "log.h"
68 #include "misc.h"
69 #include "channels.h"
70 #include "compat.h"
71 #include "canohost.h"
72 #include "key.h"
73 #include "authfd.h"
74 #include "pathnames.h"
75 #include "bufaux.h"
76
77 /* -- channel core */
78
79 /*
80  * Pointer to an array containing all allocated channels.  The array is
81  * dynamically extended as needed.
82  */
83 static Channel **channels = NULL;
84
85 /*
86  * Size of the channel array.  All slots of the array must always be
87  * initialized (at least the type field); unused slots set to NULL
88  */
89 static u_int channels_alloc = 0;
90
91 /*
92  * Maximum file descriptor value used in any of the channels.  This is
93  * updated in channel_new.
94  */
95 static int channel_max_fd = 0;
96
97
98 /* -- tcp forwarding */
99
100 /*
101  * Data structure for storing which hosts are permitted for forward requests.
102  * The local sides of any remote forwards are stored in this array to prevent
103  * a corrupt remote server from accessing arbitrary TCP/IP ports on our local
104  * network (which might be behind a firewall).
105  */
106 typedef struct {
107         char *host_to_connect;          /* Connect to 'host'. */
108         u_short port_to_connect;        /* Connect to 'port'. */
109         u_short listen_port;            /* Remote side should listen port number. */
110 } ForwardPermission;
111
112 /* List of all permitted host/port pairs to connect by the user. */
113 static ForwardPermission permitted_opens[SSH_MAX_FORWARDS_PER_DIRECTION];
114
115 /* List of all permitted host/port pairs to connect by the admin. */
116 static ForwardPermission permitted_adm_opens[SSH_MAX_FORWARDS_PER_DIRECTION];
117
118 /* Number of permitted host/port pairs in the array permitted by the user. */
119 static int num_permitted_opens = 0;
120
121 /* Number of permitted host/port pair in the array permitted by the admin. */
122 static int num_adm_permitted_opens = 0;
123
124 /*
125  * If this is true, all opens are permitted.  This is the case on the server
126  * on which we have to trust the client anyway, and the user could do
127  * anything after logging in anyway.
128  */
129 static int all_opens_permitted = 0;
130
131
132 /* -- X11 forwarding */
133
134 /* Maximum number of fake X11 displays to try. */
135 #define MAX_DISPLAYS  1000
136
137 /* Saved X11 local (client) display. */
138 static char *x11_saved_display = NULL;
139
140 /* Saved X11 authentication protocol name. */
141 static char *x11_saved_proto = NULL;
142
143 /* Saved X11 authentication data.  This is the real data. */
144 static char *x11_saved_data = NULL;
145 static u_int x11_saved_data_len = 0;
146
147 /*
148  * Fake X11 authentication data.  This is what the server will be sending us;
149  * we should replace any occurrences of this by the real data.
150  */
151 static u_char *x11_fake_data = NULL;
152 static u_int x11_fake_data_len;
153
154
155 /* -- agent forwarding */
156
157 #define NUM_SOCKS       10
158
159 /* AF_UNSPEC or AF_INET or AF_INET6 */
160 static int IPv4or6 = AF_UNSPEC;
161
162 /* helper */
163 static void port_open_helper(Channel *c, char *rtype);
164
165 /* -- channel core */
166
167 Channel *
168 channel_by_id(int id)
169 {
170         Channel *c;
171
172         if (id < 0 || (u_int)id >= channels_alloc) {
173                 logit("channel_by_id: %d: bad id", id);
174                 return NULL;
175         }
176         c = channels[id];
177         if (c == NULL) {
178                 logit("channel_by_id: %d: bad id: channel free", id);
179                 return NULL;
180         }
181         return c;
182 }
183
184 /*
185  * Returns the channel if it is allowed to receive protocol messages.
186  * Private channels, like listening sockets, may not receive messages.
187  */
188 Channel *
189 channel_lookup(int id)
190 {
191         Channel *c;
192
193         if ((c = channel_by_id(id)) == NULL)
194                 return (NULL);
195
196         switch (c->type) {
197         case SSH_CHANNEL_X11_OPEN:
198         case SSH_CHANNEL_LARVAL:
199         case SSH_CHANNEL_CONNECTING:
200         case SSH_CHANNEL_DYNAMIC:
201         case SSH_CHANNEL_OPENING:
202         case SSH_CHANNEL_OPEN:
203         case SSH_CHANNEL_INPUT_DRAINING:
204         case SSH_CHANNEL_OUTPUT_DRAINING:
205                 return (c);
206         }
207         logit("Non-public channel %d, type %d.", id, c->type);
208         return (NULL);
209 }
210
211 /*
212  * Register filedescriptors for a channel, used when allocating a channel or
213  * when the channel consumer/producer is ready, e.g. shell exec'd
214  */
215 static void
216 channel_register_fds(Channel *c, int rfd, int wfd, int efd,
217     int extusage, int nonblock)
218 {
219         /* Update the maximum file descriptor value. */
220         channel_max_fd = MAX(channel_max_fd, rfd);
221         channel_max_fd = MAX(channel_max_fd, wfd);
222         channel_max_fd = MAX(channel_max_fd, efd);
223
224         /* XXX set close-on-exec -markus */
225
226         c->rfd = rfd;
227         c->wfd = wfd;
228         c->sock = (rfd == wfd) ? rfd : -1;
229         c->ctl_fd = -1; /* XXX: set elsewhere */
230         c->efd = efd;
231         c->extended_usage = extusage;
232
233         /* XXX ugly hack: nonblock is only set by the server */
234         if (nonblock && isatty(c->rfd)) {
235                 debug2("channel %d: rfd %d isatty", c->self, c->rfd);
236                 c->isatty = 1;
237                 if (!isatty(c->wfd)) {
238                         error("channel %d: wfd %d is not a tty?",
239                             c->self, c->wfd);
240                 }
241         } else {
242                 c->isatty = 0;
243         }
244         c->wfd_isatty = isatty(c->wfd);
245
246         /* enable nonblocking mode */
247         if (nonblock) {
248                 if (rfd != -1)
249                         set_nonblock(rfd);
250                 if (wfd != -1)
251                         set_nonblock(wfd);
252                 if (efd != -1)
253                         set_nonblock(efd);
254         }
255 }
256
257 /*
258  * Allocate a new channel object and set its type and socket. This will cause
259  * remote_name to be freed.
260  */
261 Channel *
262 channel_new(char *ctype, int type, int rfd, int wfd, int efd,
263     u_int window, u_int maxpack, int extusage, char *remote_name, int nonblock)
264 {
265         int found;
266         u_int i;
267         Channel *c;
268
269         /* Do initial allocation if this is the first call. */
270         if (channels_alloc == 0) {
271                 channels_alloc = 10;
272                 channels = xcalloc(channels_alloc, sizeof(Channel *));
273                 for (i = 0; i < channels_alloc; i++)
274                         channels[i] = NULL;
275         }
276         /* Try to find a free slot where to put the new channel. */
277         for (found = -1, i = 0; i < channels_alloc; i++)
278                 if (channels[i] == NULL) {
279                         /* Found a free slot. */
280                         found = (int)i;
281                         break;
282                 }
283         if (found < 0) {
284                 /* There are no free slots.  Take last+1 slot and expand the array.  */
285                 found = channels_alloc;
286                 if (channels_alloc > 10000)
287                         fatal("channel_new: internal error: channels_alloc %d "
288                             "too big.", channels_alloc);
289                 channels = xrealloc(channels, channels_alloc + 10,
290                     sizeof(Channel *));
291                 channels_alloc += 10;
292                 debug2("channel: expanding %d", channels_alloc);
293                 for (i = found; i < channels_alloc; i++)
294                         channels[i] = NULL;
295         }
296         /* Initialize and return new channel. */
297         c = channels[found] = xcalloc(1, sizeof(Channel));
298         buffer_init(&c->input);
299         buffer_init(&c->output);
300         buffer_init(&c->extended);
301         c->ostate = CHAN_OUTPUT_OPEN;
302         c->istate = CHAN_INPUT_OPEN;
303         c->flags = 0;
304         channel_register_fds(c, rfd, wfd, efd, extusage, nonblock);
305         c->self = found;
306         c->type = type;
307         c->ctype = ctype;
308         c->local_window = window;
309         c->local_window_max = window;
310         c->local_consumed = 0;
311         c->local_maxpacket = maxpack;
312         c->remote_id = -1;
313         c->remote_name = xstrdup(remote_name);
314         c->remote_window = 0;
315         c->remote_maxpacket = 0;
316         c->force_drain = 0;
317         c->single_connection = 0;
318         c->detach_user = NULL;
319         c->detach_close = 0;
320         c->confirm = NULL;
321         c->confirm_ctx = NULL;
322         c->input_filter = NULL;
323         c->output_filter = NULL;
324         debug("channel %d: new [%s]", found, remote_name);
325         return c;
326 }
327
328 static int
329 channel_find_maxfd(void)
330 {
331         u_int i;
332         int max = 0;
333         Channel *c;
334
335         for (i = 0; i < channels_alloc; i++) {
336                 c = channels[i];
337                 if (c != NULL) {
338                         max = MAX(max, c->rfd);
339                         max = MAX(max, c->wfd);
340                         max = MAX(max, c->efd);
341                 }
342         }
343         return max;
344 }
345
346 int
347 channel_close_fd(int *fdp)
348 {
349         int ret = 0, fd = *fdp;
350
351         if (fd != -1) {
352                 ret = close(fd);
353                 *fdp = -1;
354                 if (fd == channel_max_fd)
355                         channel_max_fd = channel_find_maxfd();
356         }
357         return ret;
358 }
359
360 /* Close all channel fd/socket. */
361 static void
362 channel_close_fds(Channel *c)
363 {
364         debug3("channel %d: close_fds r %d w %d e %d c %d",
365             c->self, c->rfd, c->wfd, c->efd, c->ctl_fd);
366
367         channel_close_fd(&c->sock);
368         channel_close_fd(&c->ctl_fd);
369         channel_close_fd(&c->rfd);
370         channel_close_fd(&c->wfd);
371         channel_close_fd(&c->efd);
372 }
373
374 /* Free the channel and close its fd/socket. */
375 void
376 channel_free(Channel *c)
377 {
378         char *s;
379         u_int i, n;
380
381         for (n = 0, i = 0; i < channels_alloc; i++)
382                 if (channels[i])
383                         n++;
384         debug("channel %d: free: %s, nchannels %u", c->self,
385             c->remote_name ? c->remote_name : "???", n);
386
387         s = channel_open_message();
388         debug3("channel %d: status: %s", c->self, s);
389         xfree(s);
390
391         if (c->sock != -1)
392                 shutdown(c->sock, SHUT_RDWR);
393         if (c->ctl_fd != -1)
394                 shutdown(c->ctl_fd, SHUT_RDWR);
395         channel_close_fds(c);
396         buffer_free(&c->input);
397         buffer_free(&c->output);
398         buffer_free(&c->extended);
399         if (c->remote_name) {
400                 xfree(c->remote_name);
401                 c->remote_name = NULL;
402         }
403         channels[c->self] = NULL;
404         xfree(c);
405 }
406
407 void
408 channel_free_all(void)
409 {
410         u_int i;
411
412         for (i = 0; i < channels_alloc; i++)
413                 if (channels[i] != NULL)
414                         channel_free(channels[i]);
415 }
416
417 /*
418  * Closes the sockets/fds of all channels.  This is used to close extra file
419  * descriptors after a fork.
420  */
421 void
422 channel_close_all(void)
423 {
424         u_int i;
425
426         for (i = 0; i < channels_alloc; i++)
427                 if (channels[i] != NULL)
428                         channel_close_fds(channels[i]);
429 }
430
431 /*
432  * Stop listening to channels.
433  */
434 void
435 channel_stop_listening(void)
436 {
437         u_int i;
438         Channel *c;
439
440         for (i = 0; i < channels_alloc; i++) {
441                 c = channels[i];
442                 if (c != NULL) {
443                         switch (c->type) {
444                         case SSH_CHANNEL_AUTH_SOCKET:
445                         case SSH_CHANNEL_PORT_LISTENER:
446                         case SSH_CHANNEL_RPORT_LISTENER:
447                         case SSH_CHANNEL_X11_LISTENER:
448                                 channel_close_fd(&c->sock);
449                                 channel_free(c);
450                                 break;
451                         }
452                 }
453         }
454 }
455
456 /*
457  * Returns true if no channel has too much buffered data, and false if one or
458  * more channel is overfull.
459  */
460 int
461 channel_not_very_much_buffered_data(void)
462 {
463         u_int i;
464         Channel *c;
465
466         for (i = 0; i < channels_alloc; i++) {
467                 c = channels[i];
468                 if (c != NULL && c->type == SSH_CHANNEL_OPEN) {
469 #if 0
470                         if (!compat20 &&
471                             buffer_len(&c->input) > packet_get_maxsize()) {
472                                 debug2("channel %d: big input buffer %d",
473                                     c->self, buffer_len(&c->input));
474                                 return 0;
475                         }
476 #endif
477                         if (buffer_len(&c->output) > packet_get_maxsize()) {
478                                 debug2("channel %d: big output buffer %u > %u",
479                                     c->self, buffer_len(&c->output),
480                                     packet_get_maxsize());
481                                 return 0;
482                         }
483                 }
484         }
485         return 1;
486 }
487
488 /* Returns true if any channel is still open. */
489 int
490 channel_still_open(void)
491 {
492         u_int i;
493         Channel *c;
494
495         for (i = 0; i < channels_alloc; i++) {
496                 c = channels[i];
497                 if (c == NULL)
498                         continue;
499                 switch (c->type) {
500                 case SSH_CHANNEL_X11_LISTENER:
501                 case SSH_CHANNEL_PORT_LISTENER:
502                 case SSH_CHANNEL_RPORT_LISTENER:
503                 case SSH_CHANNEL_CLOSED:
504                 case SSH_CHANNEL_AUTH_SOCKET:
505                 case SSH_CHANNEL_DYNAMIC:
506                 case SSH_CHANNEL_CONNECTING:
507                 case SSH_CHANNEL_ZOMBIE:
508                         continue;
509                 case SSH_CHANNEL_LARVAL:
510                         if (!compat20)
511                                 fatal("cannot happen: SSH_CHANNEL_LARVAL");
512                         continue;
513                 case SSH_CHANNEL_OPENING:
514                 case SSH_CHANNEL_OPEN:
515                 case SSH_CHANNEL_X11_OPEN:
516                         return 1;
517                 case SSH_CHANNEL_INPUT_DRAINING:
518                 case SSH_CHANNEL_OUTPUT_DRAINING:
519                         if (!compat13)
520                                 fatal("cannot happen: OUT_DRAIN");
521                         return 1;
522                 default:
523                         fatal("channel_still_open: bad channel type %d", c->type);
524                         /* NOTREACHED */
525                 }
526         }
527         return 0;
528 }
529
530 /* Returns the id of an open channel suitable for keepaliving */
531 int
532 channel_find_open(void)
533 {
534         u_int i;
535         Channel *c;
536
537         for (i = 0; i < channels_alloc; i++) {
538                 c = channels[i];
539                 if (c == NULL || c->remote_id < 0)
540                         continue;
541                 switch (c->type) {
542                 case SSH_CHANNEL_CLOSED:
543                 case SSH_CHANNEL_DYNAMIC:
544                 case SSH_CHANNEL_X11_LISTENER:
545                 case SSH_CHANNEL_PORT_LISTENER:
546                 case SSH_CHANNEL_RPORT_LISTENER:
547                 case SSH_CHANNEL_OPENING:
548                 case SSH_CHANNEL_CONNECTING:
549                 case SSH_CHANNEL_ZOMBIE:
550                         continue;
551                 case SSH_CHANNEL_LARVAL:
552                 case SSH_CHANNEL_AUTH_SOCKET:
553                 case SSH_CHANNEL_OPEN:
554                 case SSH_CHANNEL_X11_OPEN:
555                         return i;
556                 case SSH_CHANNEL_INPUT_DRAINING:
557                 case SSH_CHANNEL_OUTPUT_DRAINING:
558                         if (!compat13)
559                                 fatal("cannot happen: OUT_DRAIN");
560                         return i;
561                 default:
562                         fatal("channel_find_open: bad channel type %d", c->type);
563                         /* NOTREACHED */
564                 }
565         }
566         return -1;
567 }
568
569
570 /*
571  * Returns a message describing the currently open forwarded connections,
572  * suitable for sending to the client.  The message contains crlf pairs for
573  * newlines.
574  */
575 char *
576 channel_open_message(void)
577 {
578         Buffer buffer;
579         Channel *c;
580         char buf[1024], *cp;
581         u_int i;
582
583         buffer_init(&buffer);
584         snprintf(buf, sizeof buf, "The following connections are open:\r\n");
585         buffer_append(&buffer, buf, strlen(buf));
586         for (i = 0; i < channels_alloc; i++) {
587                 c = channels[i];
588                 if (c == NULL)
589                         continue;
590                 switch (c->type) {
591                 case SSH_CHANNEL_X11_LISTENER:
592                 case SSH_CHANNEL_PORT_LISTENER:
593                 case SSH_CHANNEL_RPORT_LISTENER:
594                 case SSH_CHANNEL_CLOSED:
595                 case SSH_CHANNEL_AUTH_SOCKET:
596                 case SSH_CHANNEL_ZOMBIE:
597                         continue;
598                 case SSH_CHANNEL_LARVAL:
599                 case SSH_CHANNEL_OPENING:
600                 case SSH_CHANNEL_CONNECTING:
601                 case SSH_CHANNEL_DYNAMIC:
602                 case SSH_CHANNEL_OPEN:
603                 case SSH_CHANNEL_X11_OPEN:
604                 case SSH_CHANNEL_INPUT_DRAINING:
605                 case SSH_CHANNEL_OUTPUT_DRAINING:
606                         snprintf(buf, sizeof buf,
607                             "  #%d %.300s (t%d r%d i%d/%d o%d/%d fd %d/%d cfd %d)\r\n",
608                             c->self, c->remote_name,
609                             c->type, c->remote_id,
610                             c->istate, buffer_len(&c->input),
611                             c->ostate, buffer_len(&c->output),
612                             c->rfd, c->wfd, c->ctl_fd);
613                         buffer_append(&buffer, buf, strlen(buf));
614                         continue;
615                 default:
616                         fatal("channel_open_message: bad channel type %d", c->type);
617                         /* NOTREACHED */
618                 }
619         }
620         buffer_append(&buffer, "\0", 1);
621         cp = xstrdup(buffer_ptr(&buffer));
622         buffer_free(&buffer);
623         return cp;
624 }
625
626 void
627 channel_send_open(int id)
628 {
629         Channel *c = channel_lookup(id);
630
631         if (c == NULL) {
632                 logit("channel_send_open: %d: bad id", id);
633                 return;
634         }
635         debug2("channel %d: send open", id);
636         packet_start(SSH2_MSG_CHANNEL_OPEN);
637         packet_put_cstring(c->ctype);
638         packet_put_int(c->self);
639         packet_put_int(c->local_window);
640         packet_put_int(c->local_maxpacket);
641         packet_send();
642 }
643
644 void
645 channel_request_start(int id, char *service, int wantconfirm)
646 {
647         Channel *c = channel_lookup(id);
648
649         if (c == NULL) {
650                 logit("channel_request_start: %d: unknown channel id", id);
651                 return;
652         }
653         debug2("channel %d: request %s confirm %d", id, service, wantconfirm);
654         packet_start(SSH2_MSG_CHANNEL_REQUEST);
655         packet_put_int(c->remote_id);
656         packet_put_cstring(service);
657         packet_put_char(wantconfirm);
658 }
659
660 void
661 channel_register_confirm(int id, channel_callback_fn *fn, void *ctx)
662 {
663         Channel *c = channel_lookup(id);
664
665         if (c == NULL) {
666                 logit("channel_register_comfirm: %d: bad id", id);
667                 return;
668         }
669         c->confirm = fn;
670         c->confirm_ctx = ctx;
671 }
672
673 void
674 channel_register_cleanup(int id, channel_callback_fn *fn, int do_close)
675 {
676         Channel *c = channel_by_id(id);
677
678         if (c == NULL) {
679                 logit("channel_register_cleanup: %d: bad id", id);
680                 return;
681         }
682         c->detach_user = fn;
683         c->detach_close = do_close;
684 }
685
686 void
687 channel_cancel_cleanup(int id)
688 {
689         Channel *c = channel_by_id(id);
690
691         if (c == NULL) {
692                 logit("channel_cancel_cleanup: %d: bad id", id);
693                 return;
694         }
695         c->detach_user = NULL;
696         c->detach_close = 0;
697 }
698
699 void
700 channel_register_filter(int id, channel_infilter_fn *ifn,
701     channel_outfilter_fn *ofn)
702 {
703         Channel *c = channel_lookup(id);
704
705         if (c == NULL) {
706                 logit("channel_register_filter: %d: bad id", id);
707                 return;
708         }
709         c->input_filter = ifn;
710         c->output_filter = ofn;
711 }
712
713 void
714 channel_set_fds(int id, int rfd, int wfd, int efd,
715     int extusage, int nonblock, u_int window_max)
716 {
717         Channel *c = channel_lookup(id);
718
719         if (c == NULL || c->type != SSH_CHANNEL_LARVAL)
720                 fatal("channel_activate for non-larval channel %d.", id);
721         channel_register_fds(c, rfd, wfd, efd, extusage, nonblock);
722         c->type = SSH_CHANNEL_OPEN;
723         c->local_window = c->local_window_max = window_max;
724         packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
725         packet_put_int(c->remote_id);
726         packet_put_int(c->local_window);
727         packet_send();
728 }
729
730 /*
731  * 'channel_pre*' are called just before select() to add any bits relevant to
732  * channels in the select bitmasks.
733  */
734 /*
735  * 'channel_post*': perform any appropriate operations for channels which
736  * have events pending.
737  */
738 typedef void chan_fn(Channel *c, fd_set *readset, fd_set *writeset);
739 chan_fn *channel_pre[SSH_CHANNEL_MAX_TYPE];
740 chan_fn *channel_post[SSH_CHANNEL_MAX_TYPE];
741
742 /* ARGSUSED */
743 static void
744 channel_pre_listener(Channel *c, fd_set *readset, fd_set *writeset)
745 {
746         FD_SET(c->sock, readset);
747 }
748
749 /* ARGSUSED */
750 static void
751 channel_pre_connecting(Channel *c, fd_set *readset, fd_set *writeset)
752 {
753         debug3("channel %d: waiting for connection", c->self);
754         FD_SET(c->sock, writeset);
755 }
756
757 static void
758 channel_pre_open_13(Channel *c, fd_set *readset, fd_set *writeset)
759 {
760         if (buffer_len(&c->input) < packet_get_maxsize())
761                 FD_SET(c->sock, readset);
762         if (buffer_len(&c->output) > 0)
763                 FD_SET(c->sock, writeset);
764 }
765
766 static void
767 channel_pre_open(Channel *c, fd_set *readset, fd_set *writeset)
768 {
769         u_int limit = compat20 ? c->remote_window : packet_get_maxsize();
770
771         if (c->istate == CHAN_INPUT_OPEN &&
772             limit > 0 &&
773             buffer_len(&c->input) < limit &&
774             buffer_check_alloc(&c->input, CHAN_RBUF))
775                 FD_SET(c->rfd, readset);
776         if (c->ostate == CHAN_OUTPUT_OPEN ||
777             c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
778                 if (buffer_len(&c->output) > 0) {
779                         FD_SET(c->wfd, writeset);
780                 } else if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
781                         if (CHANNEL_EFD_OUTPUT_ACTIVE(c))
782                                 debug2("channel %d: obuf_empty delayed efd %d/(%d)",
783                                     c->self, c->efd, buffer_len(&c->extended));
784                         else
785                                 chan_obuf_empty(c);
786                 }
787         }
788         /** XXX check close conditions, too */
789         if (compat20 && c->efd != -1) {
790                 if (c->extended_usage == CHAN_EXTENDED_WRITE &&
791                     buffer_len(&c->extended) > 0)
792                         FD_SET(c->efd, writeset);
793                 else if (!(c->flags & CHAN_EOF_SENT) &&
794                     c->extended_usage == CHAN_EXTENDED_READ &&
795                     buffer_len(&c->extended) < c->remote_window)
796                         FD_SET(c->efd, readset);
797         }
798         /* XXX: What about efd? races? */
799         if (compat20 && c->ctl_fd != -1 &&
800             c->istate == CHAN_INPUT_OPEN && c->ostate == CHAN_OUTPUT_OPEN)
801                 FD_SET(c->ctl_fd, readset);
802 }
803
804 /* ARGSUSED */
805 static void
806 channel_pre_input_draining(Channel *c, fd_set *readset, fd_set *writeset)
807 {
808         if (buffer_len(&c->input) == 0) {
809                 packet_start(SSH_MSG_CHANNEL_CLOSE);
810                 packet_put_int(c->remote_id);
811                 packet_send();
812                 c->type = SSH_CHANNEL_CLOSED;
813                 debug2("channel %d: closing after input drain.", c->self);
814         }
815 }
816
817 /* ARGSUSED */
818 static void
819 channel_pre_output_draining(Channel *c, fd_set *readset, fd_set *writeset)
820 {
821         if (buffer_len(&c->output) == 0)
822                 chan_mark_dead(c);
823         else
824                 FD_SET(c->sock, writeset);
825 }
826
827 /*
828  * This is a special state for X11 authentication spoofing.  An opened X11
829  * connection (when authentication spoofing is being done) remains in this
830  * state until the first packet has been completely read.  The authentication
831  * data in that packet is then substituted by the real data if it matches the
832  * fake data, and the channel is put into normal mode.
833  * XXX All this happens at the client side.
834  * Returns: 0 = need more data, -1 = wrong cookie, 1 = ok
835  */
836 static int
837 x11_open_helper(Buffer *b)
838 {
839         u_char *ucp;
840         u_int proto_len, data_len;
841
842         /* Check if the fixed size part of the packet is in buffer. */
843         if (buffer_len(b) < 12)
844                 return 0;
845
846         /* Parse the lengths of variable-length fields. */
847         ucp = buffer_ptr(b);
848         if (ucp[0] == 0x42) {   /* Byte order MSB first. */
849                 proto_len = 256 * ucp[6] + ucp[7];
850                 data_len = 256 * ucp[8] + ucp[9];
851         } else if (ucp[0] == 0x6c) {    /* Byte order LSB first. */
852                 proto_len = ucp[6] + 256 * ucp[7];
853                 data_len = ucp[8] + 256 * ucp[9];
854         } else {
855                 debug2("Initial X11 packet contains bad byte order byte: 0x%x",
856                     ucp[0]);
857                 return -1;
858         }
859
860         /* Check if the whole packet is in buffer. */
861         if (buffer_len(b) <
862             12 + ((proto_len + 3) & ~3) + ((data_len + 3) & ~3))
863                 return 0;
864
865         /* Check if authentication protocol matches. */
866         if (proto_len != strlen(x11_saved_proto) ||
867             memcmp(ucp + 12, x11_saved_proto, proto_len) != 0) {
868                 debug2("X11 connection uses different authentication protocol.");
869                 return -1;
870         }
871         /* Check if authentication data matches our fake data. */
872         if (data_len != x11_fake_data_len ||
873             memcmp(ucp + 12 + ((proto_len + 3) & ~3),
874                 x11_fake_data, x11_fake_data_len) != 0) {
875                 debug2("X11 auth data does not match fake data.");
876                 return -1;
877         }
878         /* Check fake data length */
879         if (x11_fake_data_len != x11_saved_data_len) {
880                 error("X11 fake_data_len %d != saved_data_len %d",
881                     x11_fake_data_len, x11_saved_data_len);
882                 return -1;
883         }
884         /*
885          * Received authentication protocol and data match
886          * our fake data. Substitute the fake data with real
887          * data.
888          */
889         memcpy(ucp + 12 + ((proto_len + 3) & ~3),
890             x11_saved_data, x11_saved_data_len);
891         return 1;
892 }
893
894 static void
895 channel_pre_x11_open_13(Channel *c, fd_set *readset, fd_set *writeset)
896 {
897         int ret = x11_open_helper(&c->output);
898
899         if (ret == 1) {
900                 /* Start normal processing for the channel. */
901                 c->type = SSH_CHANNEL_OPEN;
902                 channel_pre_open_13(c, readset, writeset);
903         } else if (ret == -1) {
904                 /*
905                  * We have received an X11 connection that has bad
906                  * authentication information.
907                  */
908                 logit("X11 connection rejected because of wrong authentication.");
909                 buffer_clear(&c->input);
910                 buffer_clear(&c->output);
911                 channel_close_fd(&c->sock);
912                 c->sock = -1;
913                 c->type = SSH_CHANNEL_CLOSED;
914                 packet_start(SSH_MSG_CHANNEL_CLOSE);
915                 packet_put_int(c->remote_id);
916                 packet_send();
917         }
918 }
919
920 static void
921 channel_pre_x11_open(Channel *c, fd_set *readset, fd_set *writeset)
922 {
923         int ret = x11_open_helper(&c->output);
924
925         /* c->force_drain = 1; */
926
927         if (ret == 1) {
928                 c->type = SSH_CHANNEL_OPEN;
929                 channel_pre_open(c, readset, writeset);
930         } else if (ret == -1) {
931                 logit("X11 connection rejected because of wrong authentication.");
932                 debug2("X11 rejected %d i%d/o%d", c->self, c->istate, c->ostate);
933                 chan_read_failed(c);
934                 buffer_clear(&c->input);
935                 chan_ibuf_empty(c);
936                 buffer_clear(&c->output);
937                 /* for proto v1, the peer will send an IEOF */
938                 if (compat20)
939                         chan_write_failed(c);
940                 else
941                         c->type = SSH_CHANNEL_OPEN;
942                 debug2("X11 closed %d i%d/o%d", c->self, c->istate, c->ostate);
943         }
944 }
945
946 /* try to decode a socks4 header */
947 /* ARGSUSED */
948 static int
949 channel_decode_socks4(Channel *c, fd_set *readset, fd_set *writeset)
950 {
951         char *p, *host;
952         u_int len, have, i, found;
953         char username[256];
954         struct {
955                 u_int8_t version;
956                 u_int8_t command;
957                 u_int16_t dest_port;
958                 struct in_addr dest_addr;
959         } s4_req, s4_rsp;
960
961         debug2("channel %d: decode socks4", c->self);
962
963         have = buffer_len(&c->input);
964         len = sizeof(s4_req);
965         if (have < len)
966                 return 0;
967         p = buffer_ptr(&c->input);
968         for (found = 0, i = len; i < have; i++) {
969                 if (p[i] == '\0') {
970                         found = 1;
971                         break;
972                 }
973                 if (i > 1024) {
974                         /* the peer is probably sending garbage */
975                         debug("channel %d: decode socks4: too long",
976                             c->self);
977                         return -1;
978                 }
979         }
980         if (!found)
981                 return 0;
982         buffer_get(&c->input, (char *)&s4_req.version, 1);
983         buffer_get(&c->input, (char *)&s4_req.command, 1);
984         buffer_get(&c->input, (char *)&s4_req.dest_port, 2);
985         buffer_get(&c->input, (char *)&s4_req.dest_addr, 4);
986         have = buffer_len(&c->input);
987         p = buffer_ptr(&c->input);
988         len = strlen(p);
989         debug2("channel %d: decode socks4: user %s/%d", c->self, p, len);
990         if (len > have)
991                 fatal("channel %d: decode socks4: len %d > have %d",
992                     c->self, len, have);
993         strlcpy(username, p, sizeof(username));
994         buffer_consume(&c->input, len);
995         buffer_consume(&c->input, 1);           /* trailing '\0' */
996
997         host = inet_ntoa(s4_req.dest_addr);
998         strlcpy(c->path, host, sizeof(c->path));
999         c->host_port = ntohs(s4_req.dest_port);
1000
1001         debug2("channel %d: dynamic request: socks4 host %s port %u command %u",
1002             c->self, host, c->host_port, s4_req.command);
1003
1004         if (s4_req.command != 1) {
1005                 debug("channel %d: cannot handle: socks4 cn %d",
1006                     c->self, s4_req.command);
1007                 return -1;
1008         }
1009         s4_rsp.version = 0;                     /* vn: 0 for reply */
1010         s4_rsp.command = 90;                    /* cd: req granted */
1011         s4_rsp.dest_port = 0;                   /* ignored */
1012         s4_rsp.dest_addr.s_addr = INADDR_ANY;   /* ignored */
1013         buffer_append(&c->output, &s4_rsp, sizeof(s4_rsp));
1014         return 1;
1015 }
1016
1017 /* try to decode a socks5 header */
1018 #define SSH_SOCKS5_AUTHDONE     0x1000
1019 #define SSH_SOCKS5_NOAUTH       0x00
1020 #define SSH_SOCKS5_IPV4         0x01
1021 #define SSH_SOCKS5_DOMAIN       0x03
1022 #define SSH_SOCKS5_IPV6         0x04
1023 #define SSH_SOCKS5_CONNECT      0x01
1024 #define SSH_SOCKS5_SUCCESS      0x00
1025
1026 /* ARGSUSED */
1027 static int
1028 channel_decode_socks5(Channel *c, fd_set *readset, fd_set *writeset)
1029 {
1030         struct {
1031                 u_int8_t version;
1032                 u_int8_t command;
1033                 u_int8_t reserved;
1034                 u_int8_t atyp;
1035         } s5_req, s5_rsp;
1036         u_int16_t dest_port;
1037         u_char *p, dest_addr[255+1];
1038         u_int have, need, i, found, nmethods, addrlen, af;
1039
1040         debug2("channel %d: decode socks5", c->self);
1041         p = buffer_ptr(&c->input);
1042         if (p[0] != 0x05)
1043                 return -1;
1044         have = buffer_len(&c->input);
1045         if (!(c->flags & SSH_SOCKS5_AUTHDONE)) {
1046                 /* format: ver | nmethods | methods */
1047                 if (have < 2)
1048                         return 0;
1049                 nmethods = p[1];
1050                 if (have < nmethods + 2)
1051                         return 0;
1052                 /* look for method: "NO AUTHENTICATION REQUIRED" */
1053                 for (found = 0, i = 2 ; i < nmethods + 2; i++) {
1054                         if (p[i] == SSH_SOCKS5_NOAUTH ) {
1055                                 found = 1;
1056                                 break;
1057                         }
1058                 }
1059                 if (!found) {
1060                         debug("channel %d: method SSH_SOCKS5_NOAUTH not found",
1061                             c->self);
1062                         return -1;
1063                 }
1064                 buffer_consume(&c->input, nmethods + 2);
1065                 buffer_put_char(&c->output, 0x05);              /* version */
1066                 buffer_put_char(&c->output, SSH_SOCKS5_NOAUTH); /* method */
1067                 FD_SET(c->sock, writeset);
1068                 c->flags |= SSH_SOCKS5_AUTHDONE;
1069                 debug2("channel %d: socks5 auth done", c->self);
1070                 return 0;                               /* need more */
1071         }
1072         debug2("channel %d: socks5 post auth", c->self);
1073         if (have < sizeof(s5_req)+1)
1074                 return 0;                       /* need more */
1075         memcpy(&s5_req, p, sizeof(s5_req));
1076         if (s5_req.version != 0x05 ||
1077             s5_req.command != SSH_SOCKS5_CONNECT ||
1078             s5_req.reserved != 0x00) {
1079                 debug2("channel %d: only socks5 connect supported", c->self);
1080                 return -1;
1081         }
1082         switch (s5_req.atyp){
1083         case SSH_SOCKS5_IPV4:
1084                 addrlen = 4;
1085                 af = AF_INET;
1086                 break;
1087         case SSH_SOCKS5_DOMAIN:
1088                 addrlen = p[sizeof(s5_req)];
1089                 af = -1;
1090                 break;
1091         case SSH_SOCKS5_IPV6:
1092                 addrlen = 16;
1093                 af = AF_INET6;
1094                 break;
1095         default:
1096                 debug2("channel %d: bad socks5 atyp %d", c->self, s5_req.atyp);
1097                 return -1;
1098         }
1099         need = sizeof(s5_req) + addrlen + 2;
1100         if (s5_req.atyp == SSH_SOCKS5_DOMAIN)
1101                 need++;
1102         if (have < need)
1103                 return 0;
1104         buffer_consume(&c->input, sizeof(s5_req));
1105         if (s5_req.atyp == SSH_SOCKS5_DOMAIN)
1106                 buffer_consume(&c->input, 1);    /* host string length */
1107         buffer_get(&c->input, (char *)&dest_addr, addrlen);
1108         buffer_get(&c->input, (char *)&dest_port, 2);
1109         dest_addr[addrlen] = '\0';
1110         if (s5_req.atyp == SSH_SOCKS5_DOMAIN)
1111                 strlcpy(c->path, (char *)dest_addr, sizeof(c->path));
1112         else if (inet_ntop(af, dest_addr, c->path, sizeof(c->path)) == NULL)
1113                 return -1;
1114         c->host_port = ntohs(dest_port);
1115
1116         debug2("channel %d: dynamic request: socks5 host %s port %u command %u",
1117             c->self, c->path, c->host_port, s5_req.command);
1118
1119         s5_rsp.version = 0x05;
1120         s5_rsp.command = SSH_SOCKS5_SUCCESS;
1121         s5_rsp.reserved = 0;                    /* ignored */
1122         s5_rsp.atyp = SSH_SOCKS5_IPV4;
1123         ((struct in_addr *)&dest_addr)->s_addr = INADDR_ANY;
1124         dest_port = 0;                          /* ignored */
1125
1126         buffer_append(&c->output, &s5_rsp, sizeof(s5_rsp));
1127         buffer_append(&c->output, &dest_addr, sizeof(struct in_addr));
1128         buffer_append(&c->output, &dest_port, sizeof(dest_port));
1129         return 1;
1130 }
1131
1132 /* dynamic port forwarding */
1133 static void
1134 channel_pre_dynamic(Channel *c, fd_set *readset, fd_set *writeset)
1135 {
1136         u_char *p;
1137         u_int have;
1138         int ret;
1139
1140         have = buffer_len(&c->input);
1141         c->delayed = 0;
1142         debug2("channel %d: pre_dynamic: have %d", c->self, have);
1143         /* buffer_dump(&c->input); */
1144         /* check if the fixed size part of the packet is in buffer. */
1145         if (have < 3) {
1146                 /* need more */
1147                 FD_SET(c->sock, readset);
1148                 return;
1149         }
1150         /* try to guess the protocol */
1151         p = buffer_ptr(&c->input);
1152         switch (p[0]) {
1153         case 0x04:
1154                 ret = channel_decode_socks4(c, readset, writeset);
1155                 break;
1156         case 0x05:
1157                 ret = channel_decode_socks5(c, readset, writeset);
1158                 break;
1159         default:
1160                 ret = -1;
1161                 break;
1162         }
1163         if (ret < 0) {
1164                 chan_mark_dead(c);
1165         } else if (ret == 0) {
1166                 debug2("channel %d: pre_dynamic: need more", c->self);
1167                 /* need more */
1168                 FD_SET(c->sock, readset);
1169         } else {
1170                 /* switch to the next state */
1171                 c->type = SSH_CHANNEL_OPENING;
1172                 port_open_helper(c, "direct-tcpip");
1173         }
1174 }
1175
1176 /* This is our fake X11 server socket. */
1177 /* ARGSUSED */
1178 static void
1179 channel_post_x11_listener(Channel *c, fd_set *readset, fd_set *writeset)
1180 {
1181         Channel *nc;
1182         struct sockaddr addr;
1183         int newsock;
1184         socklen_t addrlen;
1185         char buf[16384], *remote_ipaddr;
1186         int remote_port;
1187
1188         if (FD_ISSET(c->sock, readset)) {
1189                 debug("X11 connection requested.");
1190                 addrlen = sizeof(addr);
1191                 newsock = accept(c->sock, &addr, &addrlen);
1192                 if (c->single_connection) {
1193                         debug2("single_connection: closing X11 listener.");
1194                         channel_close_fd(&c->sock);
1195                         chan_mark_dead(c);
1196                 }
1197                 if (newsock < 0) {
1198                         error("accept: %.100s", strerror(errno));
1199                         return;
1200                 }
1201                 set_nodelay(newsock);
1202                 remote_ipaddr = get_peer_ipaddr(newsock);
1203                 remote_port = get_peer_port(newsock);
1204                 snprintf(buf, sizeof buf, "X11 connection from %.200s port %d",
1205                     remote_ipaddr, remote_port);
1206
1207                 nc = channel_new("accepted x11 socket",
1208                     SSH_CHANNEL_OPENING, newsock, newsock, -1,
1209                     c->local_window_max, c->local_maxpacket, 0, buf, 1);
1210                 if (compat20) {
1211                         packet_start(SSH2_MSG_CHANNEL_OPEN);
1212                         packet_put_cstring("x11");
1213                         packet_put_int(nc->self);
1214                         packet_put_int(nc->local_window_max);
1215                         packet_put_int(nc->local_maxpacket);
1216                         /* originator ipaddr and port */
1217                         packet_put_cstring(remote_ipaddr);
1218                         if (datafellows & SSH_BUG_X11FWD) {
1219                                 debug2("ssh2 x11 bug compat mode");
1220                         } else {
1221                                 packet_put_int(remote_port);
1222                         }
1223                         packet_send();
1224                 } else {
1225                         packet_start(SSH_SMSG_X11_OPEN);
1226                         packet_put_int(nc->self);
1227                         if (packet_get_protocol_flags() &
1228                             SSH_PROTOFLAG_HOST_IN_FWD_OPEN)
1229                                 packet_put_cstring(buf);
1230                         packet_send();
1231                 }
1232                 xfree(remote_ipaddr);
1233         }
1234 }
1235
1236 static void
1237 port_open_helper(Channel *c, char *rtype)
1238 {
1239         int direct;
1240         char buf[1024];
1241         char *remote_ipaddr = get_peer_ipaddr(c->sock);
1242         int remote_port = get_peer_port(c->sock);
1243
1244         direct = (strcmp(rtype, "direct-tcpip") == 0);
1245
1246         snprintf(buf, sizeof buf,
1247             "%s: listening port %d for %.100s port %d, "
1248             "connect from %.200s port %d",
1249             rtype, c->listening_port, c->path, c->host_port,
1250             remote_ipaddr, remote_port);
1251
1252         xfree(c->remote_name);
1253         c->remote_name = xstrdup(buf);
1254
1255         if (compat20) {
1256                 packet_start(SSH2_MSG_CHANNEL_OPEN);
1257                 packet_put_cstring(rtype);
1258                 packet_put_int(c->self);
1259                 packet_put_int(c->local_window_max);
1260                 packet_put_int(c->local_maxpacket);
1261                 if (direct) {
1262                         /* target host, port */
1263                         packet_put_cstring(c->path);
1264                         packet_put_int(c->host_port);
1265                 } else {
1266                         /* listen address, port */
1267                         packet_put_cstring(c->path);
1268                         packet_put_int(c->listening_port);
1269                 }
1270                 /* originator host and port */
1271                 packet_put_cstring(remote_ipaddr);
1272                 packet_put_int((u_int)remote_port);
1273                 packet_send();
1274         } else {
1275                 packet_start(SSH_MSG_PORT_OPEN);
1276                 packet_put_int(c->self);
1277                 packet_put_cstring(c->path);
1278                 packet_put_int(c->host_port);
1279                 if (packet_get_protocol_flags() &
1280                     SSH_PROTOFLAG_HOST_IN_FWD_OPEN)
1281                         packet_put_cstring(c->remote_name);
1282                 packet_send();
1283         }
1284         xfree(remote_ipaddr);
1285 }
1286
1287 static void
1288 channel_set_reuseaddr(int fd)
1289 {
1290         int on = 1;
1291
1292         /*
1293          * Set socket options.
1294          * Allow local port reuse in TIME_WAIT.
1295          */
1296         if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1)
1297                 error("setsockopt SO_REUSEADDR fd %d: %s", fd, strerror(errno));
1298 }
1299
1300 /*
1301  * This socket is listening for connections to a forwarded TCP/IP port.
1302  */
1303 /* ARGSUSED */
1304 static void
1305 channel_post_port_listener(Channel *c, fd_set *readset, fd_set *writeset)
1306 {
1307         Channel *nc;
1308         struct sockaddr addr;
1309         int newsock, nextstate;
1310         socklen_t addrlen;
1311         char *rtype;
1312
1313         if (FD_ISSET(c->sock, readset)) {
1314                 debug("Connection to port %d forwarding "
1315                     "to %.100s port %d requested.",
1316                     c->listening_port, c->path, c->host_port);
1317
1318                 if (c->type == SSH_CHANNEL_RPORT_LISTENER) {
1319                         nextstate = SSH_CHANNEL_OPENING;
1320                         rtype = "forwarded-tcpip";
1321                 } else {
1322                         if (c->host_port == 0) {
1323                                 nextstate = SSH_CHANNEL_DYNAMIC;
1324                                 rtype = "dynamic-tcpip";
1325                         } else {
1326                                 nextstate = SSH_CHANNEL_OPENING;
1327                                 rtype = "direct-tcpip";
1328                         }
1329                 }
1330
1331                 addrlen = sizeof(addr);
1332                 newsock = accept(c->sock, &addr, &addrlen);
1333                 if (newsock < 0) {
1334                         error("accept: %.100s", strerror(errno));
1335                         return;
1336                 }
1337                 set_nodelay(newsock);
1338                 nc = channel_new(rtype, nextstate, newsock, newsock, -1,
1339                     c->local_window_max, c->local_maxpacket, 0, rtype, 1);
1340                 nc->listening_port = c->listening_port;
1341                 nc->host_port = c->host_port;
1342                 strlcpy(nc->path, c->path, sizeof(nc->path));
1343
1344                 if (nextstate == SSH_CHANNEL_DYNAMIC) {
1345                         /*
1346                          * do not call the channel_post handler until
1347                          * this flag has been reset by a pre-handler.
1348                          * otherwise the FD_ISSET calls might overflow
1349                          */
1350                         nc->delayed = 1;
1351                 } else {
1352                         port_open_helper(nc, rtype);
1353                 }
1354         }
1355 }
1356
1357 /*
1358  * This is the authentication agent socket listening for connections from
1359  * clients.
1360  */
1361 /* ARGSUSED */
1362 static void
1363 channel_post_auth_listener(Channel *c, fd_set *readset, fd_set *writeset)
1364 {
1365         Channel *nc;
1366         int newsock;
1367         struct sockaddr addr;
1368         socklen_t addrlen;
1369
1370         if (FD_ISSET(c->sock, readset)) {
1371                 addrlen = sizeof(addr);
1372                 newsock = accept(c->sock, &addr, &addrlen);
1373                 if (newsock < 0) {
1374                         error("accept from auth socket: %.100s", strerror(errno));
1375                         return;
1376                 }
1377                 nc = channel_new("accepted auth socket",
1378                     SSH_CHANNEL_OPENING, newsock, newsock, -1,
1379                     c->local_window_max, c->local_maxpacket,
1380                     0, "accepted auth socket", 1);
1381                 if (compat20) {
1382                         packet_start(SSH2_MSG_CHANNEL_OPEN);
1383                         packet_put_cstring("auth-agent@openssh.com");
1384                         packet_put_int(nc->self);
1385                         packet_put_int(c->local_window_max);
1386                         packet_put_int(c->local_maxpacket);
1387                 } else {
1388                         packet_start(SSH_SMSG_AGENT_OPEN);
1389                         packet_put_int(nc->self);
1390                 }
1391                 packet_send();
1392         }
1393 }
1394
1395 /* ARGSUSED */
1396 static void
1397 channel_post_connecting(Channel *c, fd_set *readset, fd_set *writeset)
1398 {
1399         int err = 0;
1400         socklen_t sz = sizeof(err);
1401
1402         if (FD_ISSET(c->sock, writeset)) {
1403                 if (getsockopt(c->sock, SOL_SOCKET, SO_ERROR, &err, &sz) < 0) {
1404                         err = errno;
1405                         error("getsockopt SO_ERROR failed");
1406                 }
1407                 if (err == 0) {
1408                         debug("channel %d: connected", c->self);
1409                         c->type = SSH_CHANNEL_OPEN;
1410                         if (compat20) {
1411                                 packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
1412                                 packet_put_int(c->remote_id);
1413                                 packet_put_int(c->self);
1414                                 packet_put_int(c->local_window);
1415                                 packet_put_int(c->local_maxpacket);
1416                         } else {
1417                                 packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
1418                                 packet_put_int(c->remote_id);
1419                                 packet_put_int(c->self);
1420                         }
1421                 } else {
1422                         debug("channel %d: not connected: %s",
1423                             c->self, strerror(err));
1424                         if (compat20) {
1425                                 packet_start(SSH2_MSG_CHANNEL_OPEN_FAILURE);
1426                                 packet_put_int(c->remote_id);
1427                                 packet_put_int(SSH2_OPEN_CONNECT_FAILED);
1428                                 if (!(datafellows & SSH_BUG_OPENFAILURE)) {
1429                                         packet_put_cstring(strerror(err));
1430                                         packet_put_cstring("");
1431                                 }
1432                         } else {
1433                                 packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
1434                                 packet_put_int(c->remote_id);
1435                         }
1436                         chan_mark_dead(c);
1437                 }
1438                 packet_send();
1439         }
1440 }
1441
1442 /* ARGSUSED */
1443 static int
1444 channel_handle_rfd(Channel *c, fd_set *readset, fd_set *writeset)
1445 {
1446         char buf[CHAN_RBUF];
1447         int len;
1448
1449         if (c->rfd != -1 &&
1450             FD_ISSET(c->rfd, readset)) {
1451                 errno = 0;
1452                 len = read(c->rfd, buf, sizeof(buf));
1453                 if (len < 0 && (errno == EINTR || errno == EAGAIN))
1454                         return 1;
1455 #ifndef PTY_ZEROREAD
1456                 if (len <= 0) {
1457 #else
1458                 if ((!c->isatty && len <= 0) ||
1459                     (c->isatty && (len < 0 || (len == 0 && errno != 0)))) {
1460 #endif
1461                         debug2("channel %d: read<=0 rfd %d len %d",
1462                             c->self, c->rfd, len);
1463                         if (c->type != SSH_CHANNEL_OPEN) {
1464                                 debug2("channel %d: not open", c->self);
1465                                 chan_mark_dead(c);
1466                                 return -1;
1467                         } else if (compat13) {
1468                                 buffer_clear(&c->output);
1469                                 c->type = SSH_CHANNEL_INPUT_DRAINING;
1470                                 debug2("channel %d: input draining.", c->self);
1471                         } else {
1472                                 chan_read_failed(c);
1473                         }
1474                         return -1;
1475                 }
1476                 if (c->input_filter != NULL) {
1477                         if (c->input_filter(c, buf, len) == -1) {
1478                                 debug2("channel %d: filter stops", c->self);
1479                                 chan_read_failed(c);
1480                         }
1481                 } else if (c->datagram) {
1482                         buffer_put_string(&c->input, buf, len);
1483                 } else {
1484                         buffer_append(&c->input, buf, len);
1485                 }
1486         }
1487         return 1;
1488 }
1489
1490 /* ARGSUSED */
1491 static int
1492 channel_handle_wfd(Channel *c, fd_set *readset, fd_set *writeset)
1493 {
1494         struct termios tio;
1495         u_char *data = NULL, *buf;
1496         u_int dlen;
1497         int len;
1498
1499         /* Send buffered output data to the socket. */
1500         if (c->wfd != -1 &&
1501             FD_ISSET(c->wfd, writeset) &&
1502             buffer_len(&c->output) > 0) {
1503                 if (c->output_filter != NULL) {
1504                         if ((buf = c->output_filter(c, &data, &dlen)) == NULL) {
1505                                 debug2("channel %d: filter stops", c->self);
1506                                 if (c->type != SSH_CHANNEL_OPEN)
1507                                         chan_mark_dead(c);
1508                                 else
1509                                         chan_write_failed(c);
1510                                 return -1;
1511                         }
1512                 } else if (c->datagram) {
1513                         buf = data = buffer_get_string(&c->output, &dlen);
1514                 } else {
1515                         buf = data = buffer_ptr(&c->output);
1516                         dlen = buffer_len(&c->output);
1517                 }
1518
1519                 if (c->datagram) {
1520                         /* ignore truncated writes, datagrams might get lost */
1521                         c->local_consumed += dlen + 4;
1522                         len = write(c->wfd, buf, dlen);
1523                         xfree(data);
1524                         if (len < 0 && (errno == EINTR || errno == EAGAIN))
1525                                 return 1;
1526                         if (len <= 0) {
1527                                 if (c->type != SSH_CHANNEL_OPEN)
1528                                         chan_mark_dead(c);
1529                                 else
1530                                         chan_write_failed(c);
1531                                 return -1;
1532                         }
1533                         return 1;
1534                 }
1535 #ifdef _AIX
1536                 /* XXX: Later AIX versions can't push as much data to tty */
1537                 if (compat20 && c->wfd_isatty)
1538                         dlen = MIN(dlen, 8*1024);
1539 #endif
1540
1541                 len = write(c->wfd, buf, dlen);
1542                 if (len < 0 && (errno == EINTR || errno == EAGAIN))
1543                         return 1;
1544                 if (len <= 0) {
1545                         if (c->type != SSH_CHANNEL_OPEN) {
1546                                 debug2("channel %d: not open", c->self);
1547                                 chan_mark_dead(c);
1548                                 return -1;
1549                         } else if (compat13) {
1550                                 buffer_clear(&c->output);
1551                                 debug2("channel %d: input draining.", c->self);
1552                                 c->type = SSH_CHANNEL_INPUT_DRAINING;
1553                         } else {
1554                                 chan_write_failed(c);
1555                         }
1556                         return -1;
1557                 }
1558                 if (compat20 && c->isatty && dlen >= 1 && buf[0] != '\r') {
1559                         if (tcgetattr(c->wfd, &tio) == 0 &&
1560                             !(tio.c_lflag & ECHO) && (tio.c_lflag & ICANON)) {
1561                                 /*
1562                                  * Simulate echo to reduce the impact of
1563                                  * traffic analysis. We need to match the
1564                                  * size of a SSH2_MSG_CHANNEL_DATA message
1565                                  * (4 byte channel id + buf)
1566                                  */
1567                                 packet_send_ignore(4 + len);
1568                                 packet_send();
1569                         }
1570                 }
1571                 buffer_consume(&c->output, len);
1572                 if (compat20 && len > 0) {
1573                         c->local_consumed += len;
1574                 }
1575         }
1576         return 1;
1577 }
1578
1579 static int
1580 channel_handle_efd(Channel *c, fd_set *readset, fd_set *writeset)
1581 {
1582         char buf[CHAN_RBUF];
1583         int len;
1584
1585 /** XXX handle drain efd, too */
1586         if (c->efd != -1) {
1587                 if (c->extended_usage == CHAN_EXTENDED_WRITE &&
1588                     FD_ISSET(c->efd, writeset) &&
1589                     buffer_len(&c->extended) > 0) {
1590                         len = write(c->efd, buffer_ptr(&c->extended),
1591                             buffer_len(&c->extended));
1592                         debug2("channel %d: written %d to efd %d",
1593                             c->self, len, c->efd);
1594                         if (len < 0 && (errno == EINTR || errno == EAGAIN))
1595                                 return 1;
1596                         if (len <= 0) {
1597                                 debug2("channel %d: closing write-efd %d",
1598                                     c->self, c->efd);
1599                                 channel_close_fd(&c->efd);
1600                         } else {
1601                                 buffer_consume(&c->extended, len);
1602                                 c->local_consumed += len;
1603                         }
1604                 } else if (c->extended_usage == CHAN_EXTENDED_READ &&
1605                     FD_ISSET(c->efd, readset)) {
1606                         len = read(c->efd, buf, sizeof(buf));
1607                         debug2("channel %d: read %d from efd %d",
1608                             c->self, len, c->efd);
1609                         if (len < 0 && (errno == EINTR || errno == EAGAIN))
1610                                 return 1;
1611                         if (len <= 0) {
1612                                 debug2("channel %d: closing read-efd %d",
1613                                     c->self, c->efd);
1614                                 channel_close_fd(&c->efd);
1615                         } else {
1616                                 buffer_append(&c->extended, buf, len);
1617                         }
1618                 }
1619         }
1620         return 1;
1621 }
1622
1623 /* ARGSUSED */
1624 static int
1625 channel_handle_ctl(Channel *c, fd_set *readset, fd_set *writeset)
1626 {
1627         char buf[16];
1628         int len;
1629
1630         /* Monitor control fd to detect if the slave client exits */
1631         if (c->ctl_fd != -1 && FD_ISSET(c->ctl_fd, readset)) {
1632                 len = read(c->ctl_fd, buf, sizeof(buf));
1633                 if (len < 0 && (errno == EINTR || errno == EAGAIN))
1634                         return 1;
1635                 if (len <= 0) {
1636                         debug2("channel %d: ctl read<=0", c->self);
1637                         if (c->type != SSH_CHANNEL_OPEN) {
1638                                 debug2("channel %d: not open", c->self);
1639                                 chan_mark_dead(c);
1640                                 return -1;
1641                         } else {
1642                                 chan_read_failed(c);
1643                                 chan_write_failed(c);
1644                         }
1645                         return -1;
1646                 } else
1647                         fatal("%s: unexpected data on ctl fd", __func__);
1648         }
1649         return 1;
1650 }
1651
1652 static int
1653 channel_check_window(Channel *c)
1654 {
1655         if (c->type == SSH_CHANNEL_OPEN &&
1656             !(c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD)) &&
1657             c->local_window < c->local_window_max/2 &&
1658             c->local_consumed > 0) {
1659                 packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
1660                 packet_put_int(c->remote_id);
1661                 packet_put_int(c->local_consumed);
1662                 packet_send();
1663                 debug2("channel %d: window %d sent adjust %d",
1664                     c->self, c->local_window,
1665                     c->local_consumed);
1666                 c->local_window += c->local_consumed;
1667                 c->local_consumed = 0;
1668         }
1669         return 1;
1670 }
1671
1672 static void
1673 channel_post_open(Channel *c, fd_set *readset, fd_set *writeset)
1674 {
1675         if (c->delayed)
1676                 return;
1677         channel_handle_rfd(c, readset, writeset);
1678         channel_handle_wfd(c, readset, writeset);
1679         if (!compat20)
1680                 return;
1681         channel_handle_efd(c, readset, writeset);
1682         channel_handle_ctl(c, readset, writeset);
1683         channel_check_window(c);
1684 }
1685
1686 /* ARGSUSED */
1687 static void
1688 channel_post_output_drain_13(Channel *c, fd_set *readset, fd_set *writeset)
1689 {
1690         int len;
1691
1692         /* Send buffered output data to the socket. */
1693         if (FD_ISSET(c->sock, writeset) && buffer_len(&c->output) > 0) {
1694                 len = write(c->sock, buffer_ptr(&c->output),
1695                             buffer_len(&c->output));
1696                 if (len <= 0)
1697                         buffer_clear(&c->output);
1698                 else
1699                         buffer_consume(&c->output, len);
1700         }
1701 }
1702
1703 static void
1704 channel_handler_init_20(void)
1705 {
1706         channel_pre[SSH_CHANNEL_OPEN] =                 &channel_pre_open;
1707         channel_pre[SSH_CHANNEL_X11_OPEN] =             &channel_pre_x11_open;
1708         channel_pre[SSH_CHANNEL_PORT_LISTENER] =        &channel_pre_listener;
1709         channel_pre[SSH_CHANNEL_RPORT_LISTENER] =       &channel_pre_listener;
1710         channel_pre[SSH_CHANNEL_X11_LISTENER] =         &channel_pre_listener;
1711         channel_pre[SSH_CHANNEL_AUTH_SOCKET] =          &channel_pre_listener;
1712         channel_pre[SSH_CHANNEL_CONNECTING] =           &channel_pre_connecting;
1713         channel_pre[SSH_CHANNEL_DYNAMIC] =              &channel_pre_dynamic;
1714
1715         channel_post[SSH_CHANNEL_OPEN] =                &channel_post_open;
1716         channel_post[SSH_CHANNEL_PORT_LISTENER] =       &channel_post_port_listener;
1717         channel_post[SSH_CHANNEL_RPORT_LISTENER] =      &channel_post_port_listener;
1718         channel_post[SSH_CHANNEL_X11_LISTENER] =        &channel_post_x11_listener;
1719         channel_post[SSH_CHANNEL_AUTH_SOCKET] =         &channel_post_auth_listener;
1720         channel_post[SSH_CHANNEL_CONNECTING] =          &channel_post_connecting;
1721         channel_post[SSH_CHANNEL_DYNAMIC] =             &channel_post_open;
1722 }
1723
1724 static void
1725 channel_handler_init_13(void)
1726 {
1727         channel_pre[SSH_CHANNEL_OPEN] =                 &channel_pre_open_13;
1728         channel_pre[SSH_CHANNEL_X11_OPEN] =             &channel_pre_x11_open_13;
1729         channel_pre[SSH_CHANNEL_X11_LISTENER] =         &channel_pre_listener;
1730         channel_pre[SSH_CHANNEL_PORT_LISTENER] =        &channel_pre_listener;
1731         channel_pre[SSH_CHANNEL_AUTH_SOCKET] =          &channel_pre_listener;
1732         channel_pre[SSH_CHANNEL_INPUT_DRAINING] =       &channel_pre_input_draining;
1733         channel_pre[SSH_CHANNEL_OUTPUT_DRAINING] =      &channel_pre_output_draining;
1734         channel_pre[SSH_CHANNEL_CONNECTING] =           &channel_pre_connecting;
1735         channel_pre[SSH_CHANNEL_DYNAMIC] =              &channel_pre_dynamic;
1736
1737         channel_post[SSH_CHANNEL_OPEN] =                &channel_post_open;
1738         channel_post[SSH_CHANNEL_X11_LISTENER] =        &channel_post_x11_listener;
1739         channel_post[SSH_CHANNEL_PORT_LISTENER] =       &channel_post_port_listener;
1740         channel_post[SSH_CHANNEL_AUTH_SOCKET] =         &channel_post_auth_listener;
1741         channel_post[SSH_CHANNEL_OUTPUT_DRAINING] =     &channel_post_output_drain_13;
1742         channel_post[SSH_CHANNEL_CONNECTING] =          &channel_post_connecting;
1743         channel_post[SSH_CHANNEL_DYNAMIC] =             &channel_post_open;
1744 }
1745
1746 static void
1747 channel_handler_init_15(void)
1748 {
1749         channel_pre[SSH_CHANNEL_OPEN] =                 &channel_pre_open;
1750         channel_pre[SSH_CHANNEL_X11_OPEN] =             &channel_pre_x11_open;
1751         channel_pre[SSH_CHANNEL_X11_LISTENER] =         &channel_pre_listener;
1752         channel_pre[SSH_CHANNEL_PORT_LISTENER] =        &channel_pre_listener;
1753         channel_pre[SSH_CHANNEL_AUTH_SOCKET] =          &channel_pre_listener;
1754         channel_pre[SSH_CHANNEL_CONNECTING] =           &channel_pre_connecting;
1755         channel_pre[SSH_CHANNEL_DYNAMIC] =              &channel_pre_dynamic;
1756
1757         channel_post[SSH_CHANNEL_X11_LISTENER] =        &channel_post_x11_listener;
1758         channel_post[SSH_CHANNEL_PORT_LISTENER] =       &channel_post_port_listener;
1759         channel_post[SSH_CHANNEL_AUTH_SOCKET] =         &channel_post_auth_listener;
1760         channel_post[SSH_CHANNEL_OPEN] =                &channel_post_open;
1761         channel_post[SSH_CHANNEL_CONNECTING] =          &channel_post_connecting;
1762         channel_post[SSH_CHANNEL_DYNAMIC] =             &channel_post_open;
1763 }
1764
1765 static void
1766 channel_handler_init(void)
1767 {
1768         int i;
1769
1770         for (i = 0; i < SSH_CHANNEL_MAX_TYPE; i++) {
1771                 channel_pre[i] = NULL;
1772                 channel_post[i] = NULL;
1773         }
1774         if (compat20)
1775                 channel_handler_init_20();
1776         else if (compat13)
1777                 channel_handler_init_13();
1778         else
1779                 channel_handler_init_15();
1780 }
1781
1782 /* gc dead channels */
1783 static void
1784 channel_garbage_collect(Channel *c)
1785 {
1786         if (c == NULL)
1787                 return;
1788         if (c->detach_user != NULL) {
1789                 if (!chan_is_dead(c, c->detach_close))
1790                         return;
1791                 debug2("channel %d: gc: notify user", c->self);
1792                 c->detach_user(c->self, NULL);
1793                 /* if we still have a callback */
1794                 if (c->detach_user != NULL)
1795                         return;
1796                 debug2("channel %d: gc: user detached", c->self);
1797         }
1798         if (!chan_is_dead(c, 1))
1799                 return;
1800         debug2("channel %d: garbage collecting", c->self);
1801         channel_free(c);
1802 }
1803
1804 static void
1805 channel_handler(chan_fn *ftab[], fd_set *readset, fd_set *writeset)
1806 {
1807         static int did_init = 0;
1808         u_int i;
1809         Channel *c;
1810
1811         if (!did_init) {
1812                 channel_handler_init();
1813                 did_init = 1;
1814         }
1815         for (i = 0; i < channels_alloc; i++) {
1816                 c = channels[i];
1817                 if (c == NULL)
1818                         continue;
1819                 if (ftab[c->type] != NULL)
1820                         (*ftab[c->type])(c, readset, writeset);
1821                 channel_garbage_collect(c);
1822         }
1823 }
1824
1825 /*
1826  * Allocate/update select bitmasks and add any bits relevant to channels in
1827  * select bitmasks.
1828  */
1829 void
1830 channel_prepare_select(fd_set **readsetp, fd_set **writesetp, int *maxfdp,
1831     u_int *nallocp, int rekeying)
1832 {
1833         u_int n, sz, nfdset;
1834
1835         n = MAX(*maxfdp, channel_max_fd);
1836
1837         nfdset = howmany(n+1, NFDBITS);
1838         /* Explicitly test here, because xrealloc isn't always called */
1839         if (nfdset && SIZE_T_MAX / nfdset < sizeof(fd_mask))
1840                 fatal("channel_prepare_select: max_fd (%d) is too large", n);
1841         sz = nfdset * sizeof(fd_mask);
1842
1843         /* perhaps check sz < nalloc/2 and shrink? */
1844         if (*readsetp == NULL || sz > *nallocp) {
1845                 *readsetp = xrealloc(*readsetp, nfdset, sizeof(fd_mask));
1846                 *writesetp = xrealloc(*writesetp, nfdset, sizeof(fd_mask));
1847                 *nallocp = sz;
1848         }
1849         *maxfdp = n;
1850         memset(*readsetp, 0, sz);
1851         memset(*writesetp, 0, sz);
1852
1853         if (!rekeying)
1854                 channel_handler(channel_pre, *readsetp, *writesetp);
1855 }
1856
1857 /*
1858  * After select, perform any appropriate operations for channels which have
1859  * events pending.
1860  */
1861 void
1862 channel_after_select(fd_set *readset, fd_set *writeset)
1863 {
1864         channel_handler(channel_post, readset, writeset);
1865 }
1866
1867
1868 /* If there is data to send to the connection, enqueue some of it now. */
1869 void
1870 channel_output_poll(void)
1871 {
1872         Channel *c;
1873         u_int i, len;
1874
1875         for (i = 0; i < channels_alloc; i++) {
1876                 c = channels[i];
1877                 if (c == NULL)
1878                         continue;
1879
1880                 /*
1881                  * We are only interested in channels that can have buffered
1882                  * incoming data.
1883                  */
1884                 if (compat13) {
1885                         if (c->type != SSH_CHANNEL_OPEN &&
1886                             c->type != SSH_CHANNEL_INPUT_DRAINING)
1887                                 continue;
1888                 } else {
1889                         if (c->type != SSH_CHANNEL_OPEN)
1890                                 continue;
1891                 }
1892                 if (compat20 &&
1893                     (c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD))) {
1894                         /* XXX is this true? */
1895                         debug3("channel %d: will not send data after close", c->self);
1896                         continue;
1897                 }
1898
1899                 /* Get the amount of buffered data for this channel. */
1900                 if ((c->istate == CHAN_INPUT_OPEN ||
1901                     c->istate == CHAN_INPUT_WAIT_DRAIN) &&
1902                     (len = buffer_len(&c->input)) > 0) {
1903                         if (c->datagram) {
1904                                 if (len > 0) {
1905                                         u_char *data;
1906                                         u_int dlen;
1907
1908                                         data = buffer_get_string(&c->input,
1909                                             &dlen);
1910                                         packet_start(SSH2_MSG_CHANNEL_DATA);
1911                                         packet_put_int(c->remote_id);
1912                                         packet_put_string(data, dlen);
1913                                         packet_send();
1914                                         c->remote_window -= dlen + 4;
1915                                         xfree(data);
1916                                 }
1917                                 continue;
1918                         }
1919                         /*
1920                          * Send some data for the other side over the secure
1921                          * connection.
1922                          */
1923                         if (compat20) {
1924                                 if (len > c->remote_window)
1925                                         len = c->remote_window;
1926                                 if (len > c->remote_maxpacket)
1927                                         len = c->remote_maxpacket;
1928                         } else {
1929                                 if (packet_is_interactive()) {
1930                                         if (len > 1024)
1931                                                 len = 512;
1932                                 } else {
1933                                         /* Keep the packets at reasonable size. */
1934                                         if (len > packet_get_maxsize()/2)
1935                                                 len = packet_get_maxsize()/2;
1936                                 }
1937                         }
1938                         if (len > 0) {
1939                                 packet_start(compat20 ?
1940                                     SSH2_MSG_CHANNEL_DATA : SSH_MSG_CHANNEL_DATA);
1941                                 packet_put_int(c->remote_id);
1942                                 packet_put_string(buffer_ptr(&c->input), len);
1943                                 packet_send();
1944                                 buffer_consume(&c->input, len);
1945                                 c->remote_window -= len;
1946                         }
1947                 } else if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
1948                         if (compat13)
1949                                 fatal("cannot happen: istate == INPUT_WAIT_DRAIN for proto 1.3");
1950                         /*
1951                          * input-buffer is empty and read-socket shutdown:
1952                          * tell peer, that we will not send more data: send IEOF.
1953                          * hack for extended data: delay EOF if EFD still in use.
1954                          */
1955                         if (CHANNEL_EFD_INPUT_ACTIVE(c))
1956                                 debug2("channel %d: ibuf_empty delayed efd %d/(%d)",
1957                                     c->self, c->efd, buffer_len(&c->extended));
1958                         else
1959                                 chan_ibuf_empty(c);
1960                 }
1961                 /* Send extended data, i.e. stderr */
1962                 if (compat20 &&
1963                     !(c->flags & CHAN_EOF_SENT) &&
1964                     c->remote_window > 0 &&
1965                     (len = buffer_len(&c->extended)) > 0 &&
1966                     c->extended_usage == CHAN_EXTENDED_READ) {
1967                         debug2("channel %d: rwin %u elen %u euse %d",
1968                             c->self, c->remote_window, buffer_len(&c->extended),
1969                             c->extended_usage);
1970                         if (len > c->remote_window)
1971                                 len = c->remote_window;
1972                         if (len > c->remote_maxpacket)
1973                                 len = c->remote_maxpacket;
1974                         packet_start(SSH2_MSG_CHANNEL_EXTENDED_DATA);
1975                         packet_put_int(c->remote_id);
1976                         packet_put_int(SSH2_EXTENDED_DATA_STDERR);
1977                         packet_put_string(buffer_ptr(&c->extended), len);
1978                         packet_send();
1979                         buffer_consume(&c->extended, len);
1980                         c->remote_window -= len;
1981                         debug2("channel %d: sent ext data %d", c->self, len);
1982                 }
1983         }
1984 }
1985
1986
1987 /* -- protocol input */
1988
1989 /* ARGSUSED */
1990 void
1991 channel_input_data(int type, u_int32_t seq, void *ctxt)
1992 {
1993         int id;
1994         char *data;
1995         u_int data_len;
1996         Channel *c;
1997
1998         /* Get the channel number and verify it. */
1999         id = packet_get_int();
2000         c = channel_lookup(id);
2001         if (c == NULL)
2002                 packet_disconnect("Received data for nonexistent channel %d.", id);
2003
2004         /* Ignore any data for non-open channels (might happen on close) */
2005         if (c->type != SSH_CHANNEL_OPEN &&
2006             c->type != SSH_CHANNEL_X11_OPEN)
2007                 return;
2008
2009         /* Get the data. */
2010         data = packet_get_string(&data_len);
2011
2012         /*
2013          * Ignore data for protocol > 1.3 if output end is no longer open.
2014          * For protocol 2 the sending side is reducing its window as it sends
2015          * data, so we must 'fake' consumption of the data in order to ensure
2016          * that window updates are sent back.  Otherwise the connection might
2017          * deadlock.
2018          */
2019         if (!compat13 && c->ostate != CHAN_OUTPUT_OPEN) {
2020                 if (compat20) {
2021                         c->local_window -= data_len;
2022                         c->local_consumed += data_len;
2023                 }
2024                 xfree(data);
2025                 return;
2026         }
2027
2028         if (compat20) {
2029                 if (data_len > c->local_maxpacket) {
2030                         logit("channel %d: rcvd big packet %d, maxpack %d",
2031                             c->self, data_len, c->local_maxpacket);
2032                 }
2033                 if (data_len > c->local_window) {
2034                         logit("channel %d: rcvd too much data %d, win %d",
2035                             c->self, data_len, c->local_window);
2036                         xfree(data);
2037                         return;
2038                 }
2039                 c->local_window -= data_len;
2040         }
2041         packet_check_eom();
2042         if (c->datagram)
2043                 buffer_put_string(&c->output, data, data_len);
2044         else
2045                 buffer_append(&c->output, data, data_len);
2046         xfree(data);
2047 }
2048
2049 /* ARGSUSED */
2050 void
2051 channel_input_extended_data(int type, u_int32_t seq, void *ctxt)
2052 {
2053         int id;
2054         char *data;
2055         u_int data_len, tcode;
2056         Channel *c;
2057
2058         /* Get the channel number and verify it. */
2059         id = packet_get_int();
2060         c = channel_lookup(id);
2061
2062         if (c == NULL)
2063                 packet_disconnect("Received extended_data for bad channel %d.", id);
2064         if (c->type != SSH_CHANNEL_OPEN) {
2065                 logit("channel %d: ext data for non open", id);
2066                 return;
2067         }
2068         if (c->flags & CHAN_EOF_RCVD) {
2069                 if (datafellows & SSH_BUG_EXTEOF)
2070                         debug("channel %d: accepting ext data after eof", id);
2071                 else
2072                         packet_disconnect("Received extended_data after EOF "
2073                             "on channel %d.", id);
2074         }
2075         tcode = packet_get_int();
2076         if (c->efd == -1 ||
2077             c->extended_usage != CHAN_EXTENDED_WRITE ||
2078             tcode != SSH2_EXTENDED_DATA_STDERR) {
2079                 logit("channel %d: bad ext data", c->self);
2080                 return;
2081         }
2082         data = packet_get_string(&data_len);
2083         packet_check_eom();
2084         if (data_len > c->local_window) {
2085                 logit("channel %d: rcvd too much extended_data %d, win %d",
2086                     c->self, data_len, c->local_window);
2087                 xfree(data);
2088                 return;
2089         }
2090         debug2("channel %d: rcvd ext data %d", c->self, data_len);
2091         c->local_window -= data_len;
2092         buffer_append(&c->extended, data, data_len);
2093         xfree(data);
2094 }
2095
2096 /* ARGSUSED */
2097 void
2098 channel_input_ieof(int type, u_int32_t seq, void *ctxt)
2099 {
2100         int id;
2101         Channel *c;
2102
2103         id = packet_get_int();
2104         packet_check_eom();
2105         c = channel_lookup(id);
2106         if (c == NULL)
2107                 packet_disconnect("Received ieof for nonexistent channel %d.", id);
2108         chan_rcvd_ieof(c);
2109
2110         /* XXX force input close */
2111         if (c->force_drain && c->istate == CHAN_INPUT_OPEN) {
2112                 debug("channel %d: FORCE input drain", c->self);
2113                 c->istate = CHAN_INPUT_WAIT_DRAIN;
2114                 if (buffer_len(&c->input) == 0)
2115                         chan_ibuf_empty(c);
2116         }
2117
2118 }
2119
2120 /* ARGSUSED */
2121 void
2122 channel_input_close(int type, u_int32_t seq, void *ctxt)
2123 {
2124         int id;
2125         Channel *c;
2126
2127         id = packet_get_int();
2128         packet_check_eom();
2129         c = channel_lookup(id);
2130         if (c == NULL)
2131                 packet_disconnect("Received close for nonexistent channel %d.", id);
2132
2133         /*
2134          * Send a confirmation that we have closed the channel and no more
2135          * data is coming for it.
2136          */
2137         packet_start(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION);
2138         packet_put_int(c->remote_id);
2139         packet_send();
2140
2141         /*
2142          * If the channel is in closed state, we have sent a close request,
2143          * and the other side will eventually respond with a confirmation.
2144          * Thus, we cannot free the channel here, because then there would be
2145          * no-one to receive the confirmation.  The channel gets freed when
2146          * the confirmation arrives.
2147          */
2148         if (c->type != SSH_CHANNEL_CLOSED) {
2149                 /*
2150                  * Not a closed channel - mark it as draining, which will
2151                  * cause it to be freed later.
2152                  */
2153                 buffer_clear(&c->input);
2154                 c->type = SSH_CHANNEL_OUTPUT_DRAINING;
2155         }
2156 }
2157
2158 /* proto version 1.5 overloads CLOSE_CONFIRMATION with OCLOSE */
2159 /* ARGSUSED */
2160 void
2161 channel_input_oclose(int type, u_int32_t seq, void *ctxt)
2162 {
2163         int id = packet_get_int();
2164         Channel *c = channel_lookup(id);
2165
2166         packet_check_eom();
2167         if (c == NULL)
2168                 packet_disconnect("Received oclose for nonexistent channel %d.", id);
2169         chan_rcvd_oclose(c);
2170 }
2171
2172 /* ARGSUSED */
2173 void
2174 channel_input_close_confirmation(int type, u_int32_t seq, void *ctxt)
2175 {
2176         int id = packet_get_int();
2177         Channel *c = channel_lookup(id);
2178
2179         packet_check_eom();
2180         if (c == NULL)
2181                 packet_disconnect("Received close confirmation for "
2182                     "out-of-range channel %d.", id);
2183         if (c->type != SSH_CHANNEL_CLOSED)
2184                 packet_disconnect("Received close confirmation for "
2185                     "non-closed channel %d (type %d).", id, c->type);
2186         channel_free(c);
2187 }
2188
2189 /* ARGSUSED */
2190 void
2191 channel_input_open_confirmation(int type, u_int32_t seq, void *ctxt)
2192 {
2193         int id, remote_id;
2194         Channel *c;
2195
2196         id = packet_get_int();
2197         c = channel_lookup(id);
2198
2199         if (c==NULL || c->type != SSH_CHANNEL_OPENING)
2200                 packet_disconnect("Received open confirmation for "
2201                     "non-opening channel %d.", id);
2202         remote_id = packet_get_int();
2203         /* Record the remote channel number and mark that the channel is now open. */
2204         c->remote_id = remote_id;
2205         c->type = SSH_CHANNEL_OPEN;
2206
2207         if (compat20) {
2208                 c->remote_window = packet_get_int();
2209                 c->remote_maxpacket = packet_get_int();
2210                 if (c->confirm) {
2211                         debug2("callback start");
2212                         c->confirm(c->self, c->confirm_ctx);
2213                         debug2("callback done");
2214                 }
2215                 debug2("channel %d: open confirm rwindow %u rmax %u", c->self,
2216                     c->remote_window, c->remote_maxpacket);
2217         }
2218         packet_check_eom();
2219 }
2220
2221 static char *
2222 reason2txt(int reason)
2223 {
2224         switch (reason) {
2225         case SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED:
2226                 return "administratively prohibited";
2227         case SSH2_OPEN_CONNECT_FAILED:
2228                 return "connect failed";
2229         case SSH2_OPEN_UNKNOWN_CHANNEL_TYPE:
2230                 return "unknown channel type";
2231         case SSH2_OPEN_RESOURCE_SHORTAGE:
2232                 return "resource shortage";
2233         }
2234         return "unknown reason";
2235 }
2236
2237 /* ARGSUSED */
2238 void
2239 channel_input_open_failure(int type, u_int32_t seq, void *ctxt)
2240 {
2241         int id, reason;
2242         char *msg = NULL, *lang = NULL;
2243         Channel *c;
2244
2245         id = packet_get_int();
2246         c = channel_lookup(id);
2247
2248         if (c==NULL || c->type != SSH_CHANNEL_OPENING)
2249                 packet_disconnect("Received open failure for "
2250                     "non-opening channel %d.", id);
2251         if (compat20) {
2252                 reason = packet_get_int();
2253                 if (!(datafellows & SSH_BUG_OPENFAILURE)) {
2254                         msg  = packet_get_string(NULL);
2255                         lang = packet_get_string(NULL);
2256                 }
2257                 logit("channel %d: open failed: %s%s%s", id,
2258                     reason2txt(reason), msg ? ": ": "", msg ? msg : "");
2259                 if (msg != NULL)
2260                         xfree(msg);
2261                 if (lang != NULL)
2262                         xfree(lang);
2263         }
2264         packet_check_eom();
2265         /* Free the channel.  This will also close the socket. */
2266         channel_free(c);
2267 }
2268
2269 /* ARGSUSED */
2270 void
2271 channel_input_window_adjust(int type, u_int32_t seq, void *ctxt)
2272 {
2273         Channel *c;
2274         int id;
2275         u_int adjust;
2276
2277         if (!compat20)
2278                 return;
2279
2280         /* Get the channel number and verify it. */
2281         id = packet_get_int();
2282         c = channel_lookup(id);
2283
2284         if (c == NULL) {
2285                 logit("Received window adjust for non-open channel %d.", id);
2286                 return;
2287         }
2288         adjust = packet_get_int();
2289         packet_check_eom();
2290         debug2("channel %d: rcvd adjust %u", id, adjust);
2291         c->remote_window += adjust;
2292 }
2293
2294 /* ARGSUSED */
2295 void
2296 channel_input_port_open(int type, u_int32_t seq, void *ctxt)
2297 {
2298         Channel *c = NULL;
2299         u_short host_port;
2300         char *host, *originator_string;
2301         int remote_id, sock = -1;
2302
2303         remote_id = packet_get_int();
2304         host = packet_get_string(NULL);
2305         host_port = packet_get_int();
2306
2307         if (packet_get_protocol_flags() & SSH_PROTOFLAG_HOST_IN_FWD_OPEN) {
2308                 originator_string = packet_get_string(NULL);
2309         } else {
2310                 originator_string = xstrdup("unknown (remote did not supply name)");
2311         }
2312         packet_check_eom();
2313         sock = channel_connect_to(host, host_port);
2314         if (sock != -1) {
2315                 c = channel_new("connected socket",
2316                     SSH_CHANNEL_CONNECTING, sock, sock, -1, 0, 0, 0,
2317                     originator_string, 1);
2318                 c->remote_id = remote_id;
2319         }
2320         xfree(originator_string);
2321         if (c == NULL) {
2322                 packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
2323                 packet_put_int(remote_id);
2324                 packet_send();
2325         }
2326         xfree(host);
2327 }
2328
2329
2330 /* -- tcp forwarding */
2331
2332 void
2333 channel_set_af(int af)
2334 {
2335         IPv4or6 = af;
2336 }
2337
2338 static int
2339 channel_setup_fwd_listener(int type, const char *listen_addr, u_short listen_port,
2340     const char *host_to_connect, u_short port_to_connect, int gateway_ports)
2341 {
2342         Channel *c;
2343         int sock, r, success = 0, wildcard = 0, is_client;
2344         struct addrinfo hints, *ai, *aitop;
2345         const char *host, *addr;
2346         char ntop[NI_MAXHOST], strport[NI_MAXSERV];
2347
2348         host = (type == SSH_CHANNEL_RPORT_LISTENER) ?
2349             listen_addr : host_to_connect;
2350         is_client = (type == SSH_CHANNEL_PORT_LISTENER);
2351
2352         if (host == NULL) {
2353                 error("No forward host name.");
2354                 return 0;
2355         }
2356         if (strlen(host) > SSH_CHANNEL_PATH_LEN - 1) {
2357                 error("Forward host name too long.");
2358                 return 0;
2359         }
2360
2361         /*
2362          * Determine whether or not a port forward listens to loopback,
2363          * specified address or wildcard. On the client, a specified bind
2364          * address will always override gateway_ports. On the server, a
2365          * gateway_ports of 1 (``yes'') will override the client's
2366          * specification and force a wildcard bind, whereas a value of 2
2367          * (``clientspecified'') will bind to whatever address the client
2368          * asked for.
2369          *
2370          * Special-case listen_addrs are:
2371          *
2372          * "0.0.0.0"               -> wildcard v4/v6 if SSH_OLD_FORWARD_ADDR
2373          * "" (empty string), "*"  -> wildcard v4/v6
2374          * "localhost"             -> loopback v4/v6
2375          */
2376         addr = NULL;
2377         if (listen_addr == NULL) {
2378                 /* No address specified: default to gateway_ports setting */
2379                 if (gateway_ports)
2380                         wildcard = 1;
2381         } else if (gateway_ports || is_client) {
2382                 if (((datafellows & SSH_OLD_FORWARD_ADDR) &&
2383                     strcmp(listen_addr, "0.0.0.0") == 0) ||
2384                     *listen_addr == '\0' || strcmp(listen_addr, "*") == 0 ||
2385                     (!is_client && gateway_ports == 1))
2386                         wildcard = 1;
2387                 else if (strcmp(listen_addr, "localhost") != 0)
2388                         addr = listen_addr;
2389         }
2390
2391         debug3("channel_setup_fwd_listener: type %d wildcard %d addr %s",
2392             type, wildcard, (addr == NULL) ? "NULL" : addr);
2393
2394         /*
2395          * getaddrinfo returns a loopback address if the hostname is
2396          * set to NULL and hints.ai_flags is not AI_PASSIVE
2397          */
2398         memset(&hints, 0, sizeof(hints));
2399         hints.ai_family = IPv4or6;
2400         hints.ai_flags = wildcard ? AI_PASSIVE : 0;
2401         hints.ai_socktype = SOCK_STREAM;
2402         snprintf(strport, sizeof strport, "%d", listen_port);
2403         if ((r = getaddrinfo(addr, strport, &hints, &aitop)) != 0) {
2404                 if (addr == NULL) {
2405                         /* This really shouldn't happen */
2406                         packet_disconnect("getaddrinfo: fatal error: %s",
2407                             gai_strerror(r));
2408                 } else {
2409                         error("channel_setup_fwd_listener: "
2410                             "getaddrinfo(%.64s): %s", addr, gai_strerror(r));
2411                 }
2412                 return 0;
2413         }
2414
2415         for (ai = aitop; ai; ai = ai->ai_next) {
2416                 if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
2417                         continue;
2418                 if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop),
2419                     strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
2420                         error("channel_setup_fwd_listener: getnameinfo failed");
2421                         continue;
2422                 }
2423                 /* Create a port to listen for the host. */
2424                 sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
2425                 if (sock < 0) {
2426                         /* this is no error since kernel may not support ipv6 */
2427                         verbose("socket: %.100s", strerror(errno));
2428                         continue;
2429                 }
2430
2431                 channel_set_reuseaddr(sock);
2432
2433                 debug("Local forwarding listening on %s port %s.", ntop, strport);
2434
2435                 /* Bind the socket to the address. */
2436                 if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
2437                         /* address can be in use ipv6 address is already bound */
2438                         if (!ai->ai_next)
2439                                 error("bind: %.100s", strerror(errno));
2440                         else
2441                                 verbose("bind: %.100s", strerror(errno));
2442
2443                         close(sock);
2444                         continue;
2445                 }
2446                 /* Start listening for connections on the socket. */
2447                 if (listen(sock, SSH_LISTEN_BACKLOG) < 0) {
2448                         error("listen: %.100s", strerror(errno));
2449                         close(sock);
2450                         continue;
2451                 }
2452                 /* Allocate a channel number for the socket. */
2453                 c = channel_new("port listener", type, sock, sock, -1,
2454                     CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
2455                     0, "port listener", 1);
2456                 strlcpy(c->path, host, sizeof(c->path));
2457                 c->host_port = port_to_connect;
2458                 c->listening_port = listen_port;
2459                 success = 1;
2460         }
2461         if (success == 0)
2462                 error("channel_setup_fwd_listener: cannot listen to port: %d",
2463                     listen_port);
2464         freeaddrinfo(aitop);
2465         return success;
2466 }
2467
2468 int
2469 channel_cancel_rport_listener(const char *host, u_short port)
2470 {
2471         u_int i;
2472         int found = 0;
2473
2474         for (i = 0; i < channels_alloc; i++) {
2475                 Channel *c = channels[i];
2476
2477                 if (c != NULL && c->type == SSH_CHANNEL_RPORT_LISTENER &&
2478                     strncmp(c->path, host, sizeof(c->path)) == 0 &&
2479                     c->listening_port == port) {
2480                         debug2("%s: close channel %d", __func__, i);
2481                         channel_free(c);
2482                         found = 1;
2483                 }
2484         }
2485
2486         return (found);
2487 }
2488
2489 /* protocol local port fwd, used by ssh (and sshd in v1) */
2490 int
2491 channel_setup_local_fwd_listener(const char *listen_host, u_short listen_port,
2492     const char *host_to_connect, u_short port_to_connect, int gateway_ports)
2493 {
2494         return channel_setup_fwd_listener(SSH_CHANNEL_PORT_LISTENER,
2495             listen_host, listen_port, host_to_connect, port_to_connect,
2496             gateway_ports);
2497 }
2498
2499 /* protocol v2 remote port fwd, used by sshd */
2500 int
2501 channel_setup_remote_fwd_listener(const char *listen_address,
2502     u_short listen_port, int gateway_ports)
2503 {
2504         return channel_setup_fwd_listener(SSH_CHANNEL_RPORT_LISTENER,
2505             listen_address, listen_port, NULL, 0, gateway_ports);
2506 }
2507
2508 /*
2509  * Initiate forwarding of connections to port "port" on remote host through
2510  * the secure channel to host:port from local side.
2511  */
2512
2513 int
2514 channel_request_remote_forwarding(const char *listen_host, u_short listen_port,
2515     const char *host_to_connect, u_short port_to_connect)
2516 {
2517         int type, success = 0;
2518
2519         /* Record locally that connection to this host/port is permitted. */
2520         if (num_permitted_opens >= SSH_MAX_FORWARDS_PER_DIRECTION)
2521                 fatal("channel_request_remote_forwarding: too many forwards");
2522
2523         /* Send the forward request to the remote side. */
2524         if (compat20) {
2525                 const char *address_to_bind;
2526                 if (listen_host == NULL)
2527                         address_to_bind = "localhost";
2528                 else if (*listen_host == '\0' || strcmp(listen_host, "*") == 0)
2529                         address_to_bind = "";
2530                 else
2531                         address_to_bind = listen_host;
2532
2533                 packet_start(SSH2_MSG_GLOBAL_REQUEST);
2534                 packet_put_cstring("tcpip-forward");
2535                 packet_put_char(1);                     /* boolean: want reply */
2536                 packet_put_cstring(address_to_bind);
2537                 packet_put_int(listen_port);
2538                 packet_send();
2539                 packet_write_wait();
2540                 /* Assume that server accepts the request */
2541                 success = 1;
2542         } else {
2543                 packet_start(SSH_CMSG_PORT_FORWARD_REQUEST);
2544                 packet_put_int(listen_port);
2545                 packet_put_cstring(host_to_connect);
2546                 packet_put_int(port_to_connect);
2547                 packet_send();
2548                 packet_write_wait();
2549
2550                 /* Wait for response from the remote side. */
2551                 type = packet_read();
2552                 switch (type) {
2553                 case SSH_SMSG_SUCCESS:
2554                         success = 1;
2555                         break;
2556                 case SSH_SMSG_FAILURE:
2557                         break;
2558                 default:
2559                         /* Unknown packet */
2560                         packet_disconnect("Protocol error for port forward request:"
2561                             "received packet type %d.", type);
2562                 }
2563         }
2564         if (success) {
2565                 permitted_opens[num_permitted_opens].host_to_connect = xstrdup(host_to_connect);
2566                 permitted_opens[num_permitted_opens].port_to_connect = port_to_connect;
2567                 permitted_opens[num_permitted_opens].listen_port = listen_port;
2568                 num_permitted_opens++;
2569         }
2570         return (success ? 0 : -1);
2571 }
2572
2573 /*
2574  * Request cancellation of remote forwarding of connection host:port from
2575  * local side.
2576  */
2577 void
2578 channel_request_rforward_cancel(const char *host, u_short port)
2579 {
2580         int i;
2581
2582         if (!compat20)
2583                 return;
2584
2585         for (i = 0; i < num_permitted_opens; i++) {
2586                 if (permitted_opens[i].host_to_connect != NULL &&
2587                     permitted_opens[i].listen_port == port)
2588                         break;
2589         }
2590         if (i >= num_permitted_opens) {
2591                 debug("%s: requested forward not found", __func__);
2592                 return;
2593         }
2594         packet_start(SSH2_MSG_GLOBAL_REQUEST);
2595         packet_put_cstring("cancel-tcpip-forward");
2596         packet_put_char(0);
2597         packet_put_cstring(host == NULL ? "" : host);
2598         packet_put_int(port);
2599         packet_send();
2600
2601         permitted_opens[i].listen_port = 0;
2602         permitted_opens[i].port_to_connect = 0;
2603         xfree(permitted_opens[i].host_to_connect);
2604         permitted_opens[i].host_to_connect = NULL;
2605 }
2606
2607 /*
2608  * This is called after receiving CHANNEL_FORWARDING_REQUEST.  This initates
2609  * listening for the port, and sends back a success reply (or disconnect
2610  * message if there was an error).
2611  */
2612 int
2613 channel_input_port_forward_request(int is_root, int gateway_ports)
2614 {
2615         u_short port, host_port;
2616         int success = 0;
2617         char *hostname;
2618
2619         /* Get arguments from the packet. */
2620         port = packet_get_int();
2621         hostname = packet_get_string(NULL);
2622         host_port = packet_get_int();
2623
2624 #ifndef HAVE_CYGWIN
2625         /*
2626          * Check that an unprivileged user is not trying to forward a
2627          * privileged port.
2628          */
2629         if (port < IPPORT_RESERVED && !is_root)
2630                 packet_disconnect(
2631                     "Requested forwarding of port %d but user is not root.",
2632                     port);
2633         if (host_port == 0)
2634                 packet_disconnect("Dynamic forwarding denied.");
2635 #endif
2636
2637         /* Initiate forwarding */
2638         success = channel_setup_local_fwd_listener(NULL, port, hostname,
2639             host_port, gateway_ports);
2640
2641         /* Free the argument string. */
2642         xfree(hostname);
2643
2644         return (success ? 0 : -1);
2645 }
2646
2647 /*
2648  * Permits opening to any host/port if permitted_opens[] is empty.  This is
2649  * usually called by the server, because the user could connect to any port
2650  * anyway, and the server has no way to know but to trust the client anyway.
2651  */
2652 void
2653 channel_permit_all_opens(void)
2654 {
2655         if (num_permitted_opens == 0)
2656                 all_opens_permitted = 1;
2657 }
2658
2659 void
2660 channel_add_permitted_opens(char *host, int port)
2661 {
2662         if (num_permitted_opens >= SSH_MAX_FORWARDS_PER_DIRECTION)
2663                 fatal("channel_add_permitted_opens: too many forwards");
2664         debug("allow port forwarding to host %s port %d", host, port);
2665
2666         permitted_opens[num_permitted_opens].host_to_connect = xstrdup(host);
2667         permitted_opens[num_permitted_opens].port_to_connect = port;
2668         num_permitted_opens++;
2669
2670         all_opens_permitted = 0;
2671 }
2672
2673 int
2674 channel_add_adm_permitted_opens(char *host, int port)
2675 {
2676         if (num_adm_permitted_opens >= SSH_MAX_FORWARDS_PER_DIRECTION)
2677                 fatal("channel_add_adm_permitted_opens: too many forwards");
2678         debug("config allows port forwarding to host %s port %d", host, port);
2679
2680         permitted_adm_opens[num_adm_permitted_opens].host_to_connect
2681              = xstrdup(host);
2682         permitted_adm_opens[num_adm_permitted_opens].port_to_connect = port;
2683         return ++num_adm_permitted_opens;
2684 }
2685
2686 void
2687 channel_clear_permitted_opens(void)
2688 {
2689         int i;
2690
2691         for (i = 0; i < num_permitted_opens; i++)
2692                 if (permitted_opens[i].host_to_connect != NULL)
2693                         xfree(permitted_opens[i].host_to_connect);
2694         num_permitted_opens = 0;
2695 }
2696
2697 void
2698 channel_clear_adm_permitted_opens(void)
2699 {
2700         int i;
2701
2702         for (i = 0; i < num_adm_permitted_opens; i++)
2703                 if (permitted_adm_opens[i].host_to_connect != NULL)
2704                         xfree(permitted_adm_opens[i].host_to_connect);
2705         num_adm_permitted_opens = 0;
2706 }
2707
2708 /* return socket to remote host, port */
2709 static int
2710 connect_to(const char *host, u_short port)
2711 {
2712         struct addrinfo hints, *ai, *aitop;
2713         char ntop[NI_MAXHOST], strport[NI_MAXSERV];
2714         int gaierr;
2715         int sock = -1;
2716
2717         memset(&hints, 0, sizeof(hints));
2718         hints.ai_family = IPv4or6;
2719         hints.ai_socktype = SOCK_STREAM;
2720         snprintf(strport, sizeof strport, "%d", port);
2721         if ((gaierr = getaddrinfo(host, strport, &hints, &aitop)) != 0) {
2722                 error("connect_to %.100s: unknown host (%s)", host,
2723                     gai_strerror(gaierr));
2724                 return -1;
2725         }
2726         for (ai = aitop; ai; ai = ai->ai_next) {
2727                 if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
2728                         continue;
2729                 if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop),
2730                     strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
2731                         error("connect_to: getnameinfo failed");
2732                         continue;
2733                 }
2734                 sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
2735                 if (sock < 0) {
2736                         if (ai->ai_next == NULL)
2737                                 error("socket: %.100s", strerror(errno));
2738                         else
2739                                 verbose("socket: %.100s", strerror(errno));
2740                         continue;
2741                 }
2742                 if (set_nonblock(sock) == -1)
2743                         fatal("%s: set_nonblock(%d)", __func__, sock);
2744                 if (connect(sock, ai->ai_addr, ai->ai_addrlen) < 0 &&
2745                     errno != EINPROGRESS) {
2746                         error("connect_to %.100s port %s: %.100s", ntop, strport,
2747                             strerror(errno));
2748                         close(sock);
2749                         continue;       /* fail -- try next */
2750                 }
2751                 break; /* success */
2752
2753         }
2754         freeaddrinfo(aitop);
2755         if (!ai) {
2756                 error("connect_to %.100s port %d: failed.", host, port);
2757                 return -1;
2758         }
2759         /* success */
2760         set_nodelay(sock);
2761         return sock;
2762 }
2763
2764 int
2765 channel_connect_by_listen_address(u_short listen_port)
2766 {
2767         int i;
2768
2769         for (i = 0; i < num_permitted_opens; i++)
2770                 if (permitted_opens[i].host_to_connect != NULL &&
2771                     permitted_opens[i].listen_port == listen_port)
2772                         return connect_to(
2773                             permitted_opens[i].host_to_connect,
2774                             permitted_opens[i].port_to_connect);
2775         error("WARNING: Server requests forwarding for unknown listen_port %d",
2776             listen_port);
2777         return -1;
2778 }
2779
2780 /* Check if connecting to that port is permitted and connect. */
2781 int
2782 channel_connect_to(const char *host, u_short port)
2783 {
2784         int i, permit, permit_adm = 1;
2785
2786         permit = all_opens_permitted;
2787         if (!permit) {
2788                 for (i = 0; i < num_permitted_opens; i++)
2789                         if (permitted_opens[i].host_to_connect != NULL &&
2790                             permitted_opens[i].port_to_connect == port &&
2791                             strcmp(permitted_opens[i].host_to_connect, host) == 0)
2792                                 permit = 1;
2793         }
2794
2795         if (num_adm_permitted_opens > 0) {
2796                 permit_adm = 0;
2797                 for (i = 0; i < num_adm_permitted_opens; i++)
2798                         if (permitted_adm_opens[i].host_to_connect != NULL &&
2799                             permitted_adm_opens[i].port_to_connect == port &&
2800                             strcmp(permitted_adm_opens[i].host_to_connect, host)
2801                             == 0)
2802                                 permit_adm = 1;
2803         }
2804
2805         if (!permit || !permit_adm) {
2806                 logit("Received request to connect to host %.100s port %d, "
2807                     "but the request was denied.", host, port);
2808                 return -1;
2809         }
2810         return connect_to(host, port);
2811 }
2812
2813 void
2814 channel_send_window_changes(void)
2815 {
2816         u_int i;
2817         struct winsize ws;
2818
2819         for (i = 0; i < channels_alloc; i++) {
2820                 if (channels[i] == NULL || !channels[i]->client_tty ||
2821                     channels[i]->type != SSH_CHANNEL_OPEN)
2822                         continue;
2823                 if (ioctl(channels[i]->rfd, TIOCGWINSZ, &ws) < 0)
2824                         continue;
2825                 channel_request_start(i, "window-change", 0);
2826                 packet_put_int((u_int)ws.ws_col);
2827                 packet_put_int((u_int)ws.ws_row);
2828                 packet_put_int((u_int)ws.ws_xpixel);
2829                 packet_put_int((u_int)ws.ws_ypixel);
2830                 packet_send();
2831         }
2832 }
2833
2834 /* -- X11 forwarding */
2835
2836 /*
2837  * Creates an internet domain socket for listening for X11 connections.
2838  * Returns 0 and a suitable display number for the DISPLAY variable
2839  * stored in display_numberp , or -1 if an error occurs.
2840  */
2841 int
2842 x11_create_display_inet(int x11_display_offset, int x11_use_localhost,
2843     int single_connection, u_int *display_numberp, int **chanids)
2844 {
2845         Channel *nc = NULL;
2846         int display_number, sock;
2847         u_short port;
2848         struct addrinfo hints, *ai, *aitop;
2849         char strport[NI_MAXSERV];
2850         int gaierr, n, num_socks = 0, socks[NUM_SOCKS];
2851
2852         if (chanids == NULL)
2853                 return -1;
2854
2855         for (display_number = x11_display_offset;
2856             display_number < MAX_DISPLAYS;
2857             display_number++) {
2858                 port = 6000 + display_number;
2859                 memset(&hints, 0, sizeof(hints));
2860                 hints.ai_family = IPv4or6;
2861                 hints.ai_flags = x11_use_localhost ? 0: AI_PASSIVE;
2862                 hints.ai_socktype = SOCK_STREAM;
2863                 snprintf(strport, sizeof strport, "%d", port);
2864                 if ((gaierr = getaddrinfo(NULL, strport, &hints, &aitop)) != 0) {
2865                         error("getaddrinfo: %.100s", gai_strerror(gaierr));
2866                         return -1;
2867                 }
2868                 for (ai = aitop; ai; ai = ai->ai_next) {
2869                         if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
2870                                 continue;
2871                         sock = socket(ai->ai_family, ai->ai_socktype,
2872                             ai->ai_protocol);
2873                         if (sock < 0) {
2874                                 if ((errno != EINVAL) && (errno != EAFNOSUPPORT)) {
2875                                         error("socket: %.100s", strerror(errno));
2876                                         freeaddrinfo(aitop);
2877                                         return -1;
2878                                 } else {
2879                                         debug("x11_create_display_inet: Socket family %d not supported",
2880                                                  ai->ai_family);
2881                                         continue;
2882                                 }
2883                         }
2884 #ifdef IPV6_V6ONLY
2885                         if (ai->ai_family == AF_INET6) {
2886                                 int on = 1;
2887                                 if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)) < 0)
2888                                         error("setsockopt IPV6_V6ONLY: %.100s", strerror(errno));
2889                         }
2890 #endif
2891                         channel_set_reuseaddr(sock);
2892                         if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
2893                                 debug2("bind port %d: %.100s", port, strerror(errno));
2894                                 close(sock);
2895
2896                                 if (ai->ai_next)
2897                                         continue;
2898
2899                                 for (n = 0; n < num_socks; n++) {
2900                                         close(socks[n]);
2901                                 }
2902                                 num_socks = 0;
2903                                 break;
2904                         }
2905                         socks[num_socks++] = sock;
2906 #ifndef DONT_TRY_OTHER_AF
2907                         if (num_socks == NUM_SOCKS)
2908                                 break;
2909 #else
2910                         if (x11_use_localhost) {
2911                                 if (num_socks == NUM_SOCKS)
2912                                         break;
2913                         } else {
2914                                 break;
2915                         }
2916 #endif
2917                 }
2918                 freeaddrinfo(aitop);
2919                 if (num_socks > 0)
2920                         break;
2921         }
2922         if (display_number >= MAX_DISPLAYS) {
2923                 error("Failed to allocate internet-domain X11 display socket.");
2924                 return -1;
2925         }
2926         /* Start listening for connections on the socket. */
2927         for (n = 0; n < num_socks; n++) {
2928                 sock = socks[n];
2929                 if (listen(sock, SSH_LISTEN_BACKLOG) < 0) {
2930                         error("listen: %.100s", strerror(errno));
2931                         close(sock);
2932                         return -1;
2933                 }
2934         }
2935
2936         /* Allocate a channel for each socket. */
2937         *chanids = xcalloc(num_socks + 1, sizeof(**chanids));
2938         for (n = 0; n < num_socks; n++) {
2939                 sock = socks[n];
2940                 nc = channel_new("x11 listener",
2941                     SSH_CHANNEL_X11_LISTENER, sock, sock, -1,
2942                     CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
2943                     0, "X11 inet listener", 1);
2944                 nc->single_connection = single_connection;
2945                 (*chanids)[n] = nc->self;
2946         }
2947         (*chanids)[n] = -1;
2948
2949         /* Return the display number for the DISPLAY environment variable. */
2950         *display_numberp = display_number;
2951         return (0);
2952 }
2953
2954 static int
2955 connect_local_xsocket(u_int dnr)
2956 {
2957         int sock;
2958         struct sockaddr_un addr;
2959
2960         sock = socket(AF_UNIX, SOCK_STREAM, 0);
2961         if (sock < 0)
2962                 error("socket: %.100s", strerror(errno));
2963         memset(&addr, 0, sizeof(addr));
2964         addr.sun_family = AF_UNIX;
2965         snprintf(addr.sun_path, sizeof addr.sun_path, _PATH_UNIX_X, dnr);
2966         if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == 0)
2967                 return sock;
2968         close(sock);
2969         error("connect %.100s: %.100s", addr.sun_path, strerror(errno));
2970         return -1;
2971 }
2972
2973 int
2974 x11_connect_display(void)
2975 {
2976         u_int display_number;
2977         const char *display;
2978         char buf[1024], *cp;
2979         struct addrinfo hints, *ai, *aitop;
2980         char strport[NI_MAXSERV];
2981         int gaierr, sock = 0;
2982
2983         /* Try to open a socket for the local X server. */
2984         display = getenv("DISPLAY");
2985         if (!display) {
2986                 error("DISPLAY not set.");
2987                 return -1;
2988         }
2989         /*
2990          * Now we decode the value of the DISPLAY variable and make a
2991          * connection to the real X server.
2992          */
2993
2994         /*
2995          * Check if it is a unix domain socket.  Unix domain displays are in
2996          * one of the following formats: unix:d[.s], :d[.s], ::d[.s]
2997          */
2998         if (strncmp(display, "unix:", 5) == 0 ||
2999             display[0] == ':') {
3000                 /* Connect to the unix domain socket. */
3001                 if (sscanf(strrchr(display, ':') + 1, "%u", &display_number) != 1) {
3002                         error("Could not parse display number from DISPLAY: %.100s",
3003                             display);
3004                         return -1;
3005                 }
3006                 /* Create a socket. */
3007                 sock = connect_local_xsocket(display_number);
3008                 if (sock < 0)
3009                         return -1;
3010
3011                 /* OK, we now have a connection to the display. */
3012                 return sock;
3013         }
3014         /*
3015          * Connect to an inet socket.  The DISPLAY value is supposedly
3016          * hostname:d[.s], where hostname may also be numeric IP address.
3017          */
3018         strlcpy(buf, display, sizeof(buf));
3019         cp = strchr(buf, ':');
3020         if (!cp) {
3021                 error("Could not find ':' in DISPLAY: %.100s", display);
3022                 return -1;
3023         }
3024         *cp = 0;
3025         /* buf now contains the host name.  But first we parse the display number. */
3026         if (sscanf(cp + 1, "%u", &display_number) != 1) {
3027                 error("Could not parse display number from DISPLAY: %.100s",
3028                     display);
3029                 return -1;
3030         }
3031
3032         /* Look up the host address */
3033         memset(&hints, 0, sizeof(hints));
3034         hints.ai_family = IPv4or6;
3035         hints.ai_socktype = SOCK_STREAM;
3036         snprintf(strport, sizeof strport, "%u", 6000 + display_number);
3037         if ((gaierr = getaddrinfo(buf, strport, &hints, &aitop)) != 0) {
3038                 error("%.100s: unknown host. (%s)", buf, gai_strerror(gaierr));
3039                 return -1;
3040         }
3041         for (ai = aitop; ai; ai = ai->ai_next) {
3042                 /* Create a socket. */
3043                 sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
3044                 if (sock < 0) {
3045                         debug2("socket: %.100s", strerror(errno));
3046                         continue;
3047                 }
3048                 /* Connect it to the display. */
3049                 if (connect(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
3050                         debug2("connect %.100s port %u: %.100s", buf,
3051                             6000 + display_number, strerror(errno));
3052                         close(sock);
3053                         continue;
3054                 }
3055                 /* Success */
3056                 break;
3057         }
3058         freeaddrinfo(aitop);
3059         if (!ai) {
3060                 error("connect %.100s port %u: %.100s", buf, 6000 + display_number,
3061                     strerror(errno));
3062                 return -1;
3063         }
3064         set_nodelay(sock);
3065         return sock;
3066 }
3067
3068 /*
3069  * This is called when SSH_SMSG_X11_OPEN is received.  The packet contains
3070  * the remote channel number.  We should do whatever we want, and respond
3071  * with either SSH_MSG_OPEN_CONFIRMATION or SSH_MSG_OPEN_FAILURE.
3072  */
3073
3074 /* ARGSUSED */
3075 void
3076 x11_input_open(int type, u_int32_t seq, void *ctxt)
3077 {
3078         Channel *c = NULL;
3079         int remote_id, sock = 0;
3080         char *remote_host;
3081
3082         debug("Received X11 open request.");
3083
3084         remote_id = packet_get_int();
3085
3086         if (packet_get_protocol_flags() & SSH_PROTOFLAG_HOST_IN_FWD_OPEN) {
3087                 remote_host = packet_get_string(NULL);
3088         } else {
3089                 remote_host = xstrdup("unknown (remote did not supply name)");
3090         }
3091         packet_check_eom();
3092
3093         /* Obtain a connection to the real X display. */
3094         sock = x11_connect_display();
3095         if (sock != -1) {
3096                 /* Allocate a channel for this connection. */
3097                 c = channel_new("connected x11 socket",
3098                     SSH_CHANNEL_X11_OPEN, sock, sock, -1, 0, 0, 0,
3099                     remote_host, 1);
3100                 c->remote_id = remote_id;
3101                 c->force_drain = 1;
3102         }
3103         xfree(remote_host);
3104         if (c == NULL) {
3105                 /* Send refusal to the remote host. */
3106                 packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
3107                 packet_put_int(remote_id);
3108         } else {
3109                 /* Send a confirmation to the remote host. */
3110                 packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
3111                 packet_put_int(remote_id);
3112                 packet_put_int(c->self);
3113         }
3114         packet_send();
3115 }
3116
3117 /* dummy protocol handler that denies SSH-1 requests (agent/x11) */
3118 /* ARGSUSED */
3119 void
3120 deny_input_open(int type, u_int32_t seq, void *ctxt)
3121 {
3122         int rchan = packet_get_int();
3123
3124         switch (type) {
3125         case SSH_SMSG_AGENT_OPEN:
3126                 error("Warning: ssh server tried agent forwarding.");
3127                 break;
3128         case SSH_SMSG_X11_OPEN:
3129                 error("Warning: ssh server tried X11 forwarding.");
3130                 break;
3131         default:
3132                 error("deny_input_open: type %d", type);
3133                 break;
3134         }
3135         error("Warning: this is probably a break-in attempt by a malicious server.");
3136         packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
3137         packet_put_int(rchan);
3138         packet_send();
3139 }
3140
3141 /*
3142  * Requests forwarding of X11 connections, generates fake authentication
3143  * data, and enables authentication spoofing.
3144  * This should be called in the client only.
3145  */
3146 void
3147 x11_request_forwarding_with_spoofing(int client_session_id, const char *disp,
3148     const char *proto, const char *data)
3149 {
3150         u_int data_len = (u_int) strlen(data) / 2;
3151         u_int i, value;
3152         char *new_data;
3153         int screen_number;
3154         const char *cp;
3155         u_int32_t rnd = 0;
3156
3157         if (x11_saved_display == NULL)
3158                 x11_saved_display = xstrdup(disp);
3159         else if (strcmp(disp, x11_saved_display) != 0) {
3160                 error("x11_request_forwarding_with_spoofing: different "
3161                     "$DISPLAY already forwarded");
3162                 return;
3163         }
3164
3165         cp = disp;
3166         if (disp)
3167                 cp = strchr(disp, ':');
3168         if (cp)
3169                 cp = strchr(cp, '.');
3170         if (cp)
3171                 screen_number = (u_int)strtonum(cp + 1, 0, 400, NULL);
3172         else
3173                 screen_number = 0;
3174
3175         if (x11_saved_proto == NULL) {
3176                 /* Save protocol name. */
3177                 x11_saved_proto = xstrdup(proto);
3178                 /*
3179                  * Extract real authentication data and generate fake data
3180                  * of the same length.
3181                  */
3182                 x11_saved_data = xmalloc(data_len);
3183                 x11_fake_data = xmalloc(data_len);
3184                 for (i = 0; i < data_len; i++) {
3185                         if (sscanf(data + 2 * i, "%2x", &value) != 1)
3186                                 fatal("x11_request_forwarding: bad "
3187                                     "authentication data: %.100s", data);
3188                         if (i % 4 == 0)
3189                                 rnd = arc4random();
3190                         x11_saved_data[i] = value;
3191                         x11_fake_data[i] = rnd & 0xff;
3192                         rnd >>= 8;
3193                 }
3194                 x11_saved_data_len = data_len;
3195                 x11_fake_data_len = data_len;
3196         }
3197
3198         /* Convert the fake data into hex. */
3199         new_data = tohex(x11_fake_data, data_len);
3200
3201         /* Send the request packet. */
3202         if (compat20) {
3203                 channel_request_start(client_session_id, "x11-req", 0);
3204                 packet_put_char(0);     /* XXX bool single connection */
3205         } else {
3206                 packet_start(SSH_CMSG_X11_REQUEST_FORWARDING);
3207         }
3208         packet_put_cstring(proto);
3209         packet_put_cstring(new_data);
3210         packet_put_int(screen_number);
3211         packet_send();
3212         packet_write_wait();
3213         xfree(new_data);
3214 }
3215
3216
3217 /* -- agent forwarding */
3218
3219 /* Sends a message to the server to request authentication fd forwarding. */
3220
3221 void
3222 auth_request_forwarding(void)
3223 {
3224         packet_start(SSH_CMSG_AGENT_REQUEST_FORWARDING);
3225         packet_send();
3226         packet_write_wait();
3227 }
This page took 0.296701 seconds and 5 git commands to generate.