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