annotate common-channel.c @ 1187:88fd422cfa11

2015.70
author Matt Johnston <matt@ucc.asn.au>
date Thu, 26 Nov 2015 23:04:13 +0800
parents 509cf5df51c6
children b370b4b172d0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1 /*
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
2 * Dropbear SSH
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
3 *
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
4 * Copyright (c) 2002-2004 Matt Johnston
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
5 * All rights reserved.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
6 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
8 * of this software and associated documentation files (the "Software"), to deal
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
9 * in the Software without restriction, including without limitation the rights
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
11 * copies of the Software, and to permit persons to whom the Software is
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
12 * furnished to do so, subject to the following conditions:
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
13 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
14 * The above copyright notice and this permission notice shall be included in
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
15 * all copies or substantial portions of the Software.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
16 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
23 * SOFTWARE. */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
24
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
25 /* Handle the multiplexed channels, such as sessions, x11, agent connections */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
26
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
27 #include "includes.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
28 #include "session.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
29 #include "packet.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
30 #include "ssh.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
31 #include "buffer.h"
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
32 #include "circbuffer.h"
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
33 #include "dbutil.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
34 #include "channel.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
35 #include "ssh.h"
9
7f77962de998 - Reworked non-channel fd handling to listener.c
Matt Johnston <matt@ucc.asn.au>
parents: 7
diff changeset
36 #include "listener.h"
449
3e6c536bc023 Add -W <windowsize> argument and document it.
Matt Johnston <matt@ucc.asn.au>
parents: 448
diff changeset
37 #include "runopts.h"
1032
0da8ba489c23 Move generic network routines to netio.c
Matt Johnston <matt@ucc.asn.au>
parents: 1025
diff changeset
38 #include "netio.h"
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
39
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
40 static void send_msg_channel_open_failure(unsigned int remotechan, int reason,
1098
f95b6e87cd0c Turn send_msg_channel_open_failure()'s text and lang into const char *
Gaël PORTAY <gael.portay@gmail.com>
parents: 1097
diff changeset
41 const char *text, const char *lang);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
42 static void send_msg_channel_open_confirmation(struct Channel* channel,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
43 unsigned int recvwindow,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
44 unsigned int recvmaxpacket);
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
45 static int writechannel(struct Channel* channel, int fd, circbuffer *cbuf,
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
46 const unsigned char *moredata, unsigned int *morelen);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
47 static void send_msg_channel_window_adjust(struct Channel *channel,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
48 unsigned int incr);
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
49 static void send_msg_channel_data(struct Channel *channel, int isextended);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
50 static void send_msg_channel_eof(struct Channel *channel);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
51 static void send_msg_channel_close(struct Channel *channel);
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
52 static void remove_channel(struct Channel *channel);
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
53 static unsigned int write_pending(struct Channel * channel);
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
54 static void check_close(struct Channel *channel);
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
55 static void close_chan_fd(struct Channel *channel, int fd, int how);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
56
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
57 #define FD_UNINIT (-2)
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
58 #define FD_CLOSED (-1)
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
59
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
60 #define ERRFD_IS_READ(channel) ((channel)->extrabuf == NULL)
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
61 #define ERRFD_IS_WRITE(channel) (!ERRFD_IS_READ(channel))
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
62
906
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
63 /* allow space for:
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
64 * 1 byte byte SSH_MSG_CHANNEL_DATA
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
65 * 4 bytes uint32 recipient channel
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
66 * 4 bytes string data
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
67 */
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
68 #define RECV_MAX_CHANNEL_DATA_LEN (RECV_MAX_PAYLOAD_LEN-(1+4+4))
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
69
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
70 /* Initialise all the channels */
6
ab00ef513e97 Sorted out the first channel init issues.
Matt Johnston <matt@ucc.asn.au>
parents: 4
diff changeset
71 void chaninitialise(const struct ChanType *chantypes[]) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
72
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
73 /* may as well create space for a single channel */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
74 ses.channels = (struct Channel**)m_malloc(sizeof(struct Channel*));
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
75 ses.chansize = 1;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
76 ses.channels[0] = NULL;
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
77 ses.chancount = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
78
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
79 ses.chantypes = chantypes;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
80
9
7f77962de998 - Reworked non-channel fd handling to listener.c
Matt Johnston <matt@ucc.asn.au>
parents: 7
diff changeset
81 #ifdef USING_LISTENERS
7f77962de998 - Reworked non-channel fd handling to listener.c
Matt Johnston <matt@ucc.asn.au>
parents: 7
diff changeset
82 listeners_initialise();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
83 #endif
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
84
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
85 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
86
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
87 /* Clean up channels, freeing allocated memory */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
88 void chancleanup() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
89
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
90 unsigned int i;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
91
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
92 TRACE(("enter chancleanup"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
93 for (i = 0; i < ses.chansize; i++) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
94 if (ses.channels[i] != NULL) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
95 TRACE(("channel %d closing", i))
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
96 remove_channel(ses.channels[i]);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
97 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
98 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
99 m_free(ses.channels);
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
100 TRACE(("leave chancleanup"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
101 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
102
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
103 /* Create a new channel entry, send a reply confirm or failure */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
104 /* If remotechan, transwindow and transmaxpacket are not know (for a new
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
105 * outgoing connection, with them to be filled on confirmation), they should
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
106 * all be set to 0 */
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
107 static struct Channel* newchannel(unsigned int remotechan,
7
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
108 const struct ChanType *type,
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
109 unsigned int transwindow, unsigned int transmaxpacket) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
110
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
111 struct Channel * newchan;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
112 unsigned int i, j;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
113
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
114 TRACE(("enter newchannel"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
115
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
116 /* first see if we can use existing channels */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
117 for (i = 0; i < ses.chansize; i++) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
118 if (ses.channels[i] == NULL) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
119 break;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
120 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
121 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
122
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
123 /* otherwise extend the list */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
124 if (i == ses.chansize) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
125 if (ses.chansize >= MAX_CHANNELS) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
126 TRACE(("leave newchannel: max chans reached"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
127 return NULL;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
128 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
129
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
130 /* extend the channels */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
131 ses.channels = (struct Channel**)m_realloc(ses.channels,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
132 (ses.chansize+CHAN_EXTEND_SIZE)*sizeof(struct Channel*));
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
133
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
134 ses.chansize += CHAN_EXTEND_SIZE;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
135
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
136 /* set the new channels to null */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
137 for (j = i; j < ses.chansize; j++) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
138 ses.channels[j] = NULL;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
139 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
140
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
141 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
142
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
143 newchan = (struct Channel*)m_malloc(sizeof(struct Channel));
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
144 newchan->type = type;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
145 newchan->index = i;
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
146 newchan->sent_close = newchan->recv_close = 0;
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
147 newchan->sent_eof = newchan->recv_eof = 0;
652
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
148 newchan->close_handler_done = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
149
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
150 newchan->remotechan = remotechan;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
151 newchan->transwindow = transwindow;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
152 newchan->transmaxpacket = transmaxpacket;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
153
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
154 newchan->typedata = NULL;
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
155 newchan->writefd = FD_UNINIT;
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
156 newchan->readfd = FD_UNINIT;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
157 newchan->errfd = FD_CLOSED; /* this isn't always set to start with */
243
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
158 newchan->await_open = 0;
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
159 newchan->flushing = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
160
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
161 newchan->writebuf = cbuf_new(opts.recv_window);
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
162 newchan->recvwindow = opts.recv_window;
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
163
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
164 newchan->extrabuf = NULL; /* The user code can set it up */
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
165 newchan->recvdonelen = 0;
906
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
166 newchan->recvmaxpacket = RECV_MAX_CHANNEL_DATA_LEN;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
167
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
168 newchan->prio = DROPBEAR_CHANNEL_PRIO_EARLY; /* inithandler sets it */
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
169
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
170 ses.channels[i] = newchan;
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
171 ses.chancount++;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
172
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
173 TRACE(("leave newchannel"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
174
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
175 return newchan;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
176 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
177
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
178 /* Returns the channel structure corresponding to the channel in the current
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
179 * data packet (ses.payload must be positioned appropriately).
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
180 * A valid channel is always returns, it will fail fatally with an unknown
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
181 * channel */
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
182 static struct Channel* getchannel_msg(const char* kind) {
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
183
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
184 unsigned int chan;
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
185
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
186 chan = buf_getint(ses.payload);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
187 if (chan >= ses.chansize || ses.channels[chan] == NULL) {
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
188 if (kind) {
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
189 dropbear_exit("%s for unknown channel %d", kind, chan);
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
190 } else {
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
191 dropbear_exit("Unknown channel %d", chan);
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
192 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
193 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
194 return ses.channels[chan];
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
195 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
196
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
197 struct Channel* getchannel() {
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
198 return getchannel_msg(NULL);
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
199 }
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
200
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
201 /* Iterate through the channels, performing IO if available */
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
202 void channelio(fd_set *readfds, fd_set *writefds) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
203
936
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
204 /* Listeners such as TCP, X11, agent-auth */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
205 struct Channel *channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
206 unsigned int i;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
207
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
208 /* foreach channel */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
209 for (i = 0; i < ses.chansize; i++) {
936
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
210 /* Close checking only needs to occur for channels that had IO events */
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
211 int do_check_close = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
212
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
213 channel = ses.channels[i];
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
214 if (channel == NULL) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
215 /* only process in-use channels */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
216 continue;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
217 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
218
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
219 /* read data and send it over the wire */
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
220 if (channel->readfd >= 0 && FD_ISSET(channel->readfd, readfds)) {
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
221 TRACE(("send normal readfd"))
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
222 send_msg_channel_data(channel, 0);
936
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
223 do_check_close = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
224 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
225
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
226 /* read stderr data and send it over the wire */
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
227 if (ERRFD_IS_READ(channel) && channel->errfd >= 0
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
228 && FD_ISSET(channel->errfd, readfds)) {
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
229 TRACE(("send normal errfd"))
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
230 send_msg_channel_data(channel, 1);
936
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
231 do_check_close = 1;
395
dc37bd8563e8 disapproval of revision '5fdf69ca60d1683cdd9f4c2595134bed26394834'
Matt Johnston <matt@ucc.asn.au>
parents: 394
diff changeset
232 }
dc37bd8563e8 disapproval of revision '5fdf69ca60d1683cdd9f4c2595134bed26394834'
Matt Johnston <matt@ucc.asn.au>
parents: 394
diff changeset
233
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
234 /* write to program/pipe stdin */
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
235 if (channel->writefd >= 0 && FD_ISSET(channel->writefd, writefds)) {
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
236 writechannel(channel, channel->writefd, channel->writebuf, NULL, NULL);
936
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
237 do_check_close = 1;
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
238 }
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
239
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
240 /* stderr for client mode */
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
241 if (ERRFD_IS_WRITE(channel)
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
242 && channel->errfd >= 0 && FD_ISSET(channel->errfd, writefds)) {
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
243 writechannel(channel, channel->errfd, channel->extrabuf, NULL, NULL);
936
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
244 do_check_close = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
245 }
955
36eacc322e00 Make sure the check_close() handler runs when a server child process exits
Matt Johnston <matt@ucc.asn.au>
parents: 944
diff changeset
246
36eacc322e00 Make sure the check_close() handler runs when a server child process exits
Matt Johnston <matt@ucc.asn.au>
parents: 944
diff changeset
247 if (ses.channel_signal_pending) {
36eacc322e00 Make sure the check_close() handler runs when a server child process exits
Matt Johnston <matt@ucc.asn.au>
parents: 944
diff changeset
248 /* SIGCHLD can change channel state for server sessions */
36eacc322e00 Make sure the check_close() handler runs when a server child process exits
Matt Johnston <matt@ucc.asn.au>
parents: 944
diff changeset
249 do_check_close = 1;
36eacc322e00 Make sure the check_close() handler runs when a server child process exits
Matt Johnston <matt@ucc.asn.au>
parents: 944
diff changeset
250 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
251
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
252 /* handle any channel closing etc */
936
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
253 if (do_check_close) {
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
254 check_close(channel);
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
255 }
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
256 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
257
1165
a96cf3627a58 Only clear channel_signal_pending after handling all channels,
Matt Johnston <matt@ucc.asn.au>
parents: 1122
diff changeset
258 ses.channel_signal_pending = 0;
a96cf3627a58 Only clear channel_signal_pending after handling all channels,
Matt Johnston <matt@ucc.asn.au>
parents: 1122
diff changeset
259
9
7f77962de998 - Reworked non-channel fd handling to listener.c
Matt Johnston <matt@ucc.asn.au>
parents: 7
diff changeset
260 #ifdef USING_LISTENERS
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
261 handle_listeners(readfds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
262 #endif
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
263 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
264
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
265
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
266 /* Returns true if there is data remaining to be written to stdin or
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
267 * stderr of a channel's endpoint. */
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
268 static unsigned int write_pending(struct Channel * channel) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
269
709
abd99ecd7ec2 use an empty writebuf rather than a NULL one
Matt Johnston <matt@ucc.asn.au>
parents: 707
diff changeset
270 if (channel->writefd >= 0 && cbuf_getused(channel->writebuf) > 0) {
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
271 return 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
272 } else if (channel->errfd >= 0 && channel->extrabuf &&
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
273 cbuf_getused(channel->extrabuf) > 0) {
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
274 return 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
275 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
276 return 0;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
277 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
278
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
279
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
280 /* EOF/close handling */
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
281 static void check_close(struct Channel *channel) {
467
0871a0b89f7c Don't return until the shell has quit. This will ensure that an exit status
Matt Johnston <matt@ucc.asn.au>
parents: 449
diff changeset
282 int close_allowed = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
283
731
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 722
diff changeset
284 TRACE2(("check_close: writefd %d, readfd %d, errfd %d, sent_close %d, recv_close %d",
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
285 channel->writefd, channel->readfd,
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
286 channel->errfd, channel->sent_close, channel->recv_close))
731
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 722
diff changeset
287 TRACE2(("writebuf size %d extrabuf size %d",
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
288 channel->writebuf ? cbuf_getused(channel->writebuf) : 0,
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
289 channel->extrabuf ? cbuf_getused(channel->extrabuf) : 0))
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
290
652
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
291 if (!channel->flushing
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
292 && !channel->close_handler_done
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
293 && channel->type->check_close
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
294 && channel->type->check_close(channel))
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
295 {
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
296 channel->flushing = 1;
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
297 }
467
0871a0b89f7c Don't return until the shell has quit. This will ensure that an exit status
Matt Johnston <matt@ucc.asn.au>
parents: 449
diff changeset
298
504
950c38b854a1 Don't use // style comments
Matt Johnston <matt@ucc.asn.au>
parents: 495
diff changeset
299 /* if a type-specific check_close is defined we will only exit
950c38b854a1 Don't use // style comments
Matt Johnston <matt@ucc.asn.au>
parents: 495
diff changeset
300 once that has been triggered. this is only used for a server "session"
950c38b854a1 Don't use // style comments
Matt Johnston <matt@ucc.asn.au>
parents: 495
diff changeset
301 channel, to ensure that the shell has exited (and the exit status
950c38b854a1 Don't use // style comments
Matt Johnston <matt@ucc.asn.au>
parents: 495
diff changeset
302 retrieved) before we close things up. */
467
0871a0b89f7c Don't return until the shell has quit. This will ensure that an exit status
Matt Johnston <matt@ucc.asn.au>
parents: 449
diff changeset
303 if (!channel->type->check_close
652
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
304 || channel->close_handler_done
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
305 || channel->type->check_close(channel)) {
467
0871a0b89f7c Don't return until the shell has quit. This will ensure that an exit status
Matt Johnston <matt@ucc.asn.au>
parents: 449
diff changeset
306 close_allowed = 1;
0871a0b89f7c Don't return until the shell has quit. This will ensure that an exit status
Matt Johnston <matt@ucc.asn.au>
parents: 449
diff changeset
307 }
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
308
467
0871a0b89f7c Don't return until the shell has quit. This will ensure that an exit status
Matt Johnston <matt@ucc.asn.au>
parents: 449
diff changeset
309 if (channel->recv_close && !write_pending(channel) && close_allowed) {
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
310 if (!channel->sent_close) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
311 TRACE(("Sending MSG_CHANNEL_CLOSE in response to same."))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
312 send_msg_channel_close(channel);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
313 }
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
314 remove_channel(channel);
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
315 return;
397
2908122e9eed disapproval of revision '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
Matt Johnston <matt@ucc.asn.au>
parents: 396
diff changeset
316 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
317
815
35183e8a7851 Improve EOF handling for half-close. Patch from Catalin Patulea
Matt Johnston <matt@ucc.asn.au>
parents: 770
diff changeset
318 if ((channel->recv_eof && !write_pending(channel))
35183e8a7851 Improve EOF handling for half-close. Patch from Catalin Patulea
Matt Johnston <matt@ucc.asn.au>
parents: 770
diff changeset
319 /* have a server "session" and child has exited */
35183e8a7851 Improve EOF handling for half-close. Patch from Catalin Patulea
Matt Johnston <matt@ucc.asn.au>
parents: 770
diff changeset
320 || (channel->type->check_close && close_allowed)) {
364
90cb290836de Passes most test cases now
Matt Johnston <matt@ucc.asn.au>
parents: 363
diff changeset
321 close_chan_fd(channel, channel->writefd, SHUT_WR);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
322 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
323
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
324 /* Special handling for flushing read data after an exit. We
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
325 read regardless of whether the select FD was set,
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
326 and if there isn't data available, the channel will get closed. */
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
327 if (channel->flushing) {
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
328 TRACE(("might send data, flushing"))
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
329 if (channel->readfd >= 0 && channel->transwindow > 0) {
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
330 TRACE(("send data readfd"))
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
331 send_msg_channel_data(channel, 0);
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
332 }
439
ab370c629d36 Fix a stupid bug s/readfd/errfd/ affecting channel close on child exit
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
333 if (ERRFD_IS_READ(channel) && channel->errfd >= 0
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
334 && channel->transwindow > 0) {
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
335 TRACE(("send data errfd"))
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
336 send_msg_channel_data(channel, 1);
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
337 }
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
338 }
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
339
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
340 /* If we're not going to send any more data, send EOF */
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
341 if (!channel->sent_eof
365
49fcc9875045 Remove accidentally removed block (making sure to close the channel).
Matt Johnston <matt@ucc.asn.au>
parents: 364
diff changeset
342 && channel->readfd == FD_CLOSED
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
343 && (ERRFD_IS_WRITE(channel) || channel->errfd == FD_CLOSED)) {
397
2908122e9eed disapproval of revision '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
Matt Johnston <matt@ucc.asn.au>
parents: 396
diff changeset
344 send_msg_channel_eof(channel);
2908122e9eed disapproval of revision '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
Matt Johnston <matt@ucc.asn.au>
parents: 396
diff changeset
345 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
346
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
347 /* And if we can't receive any more data from them either, close up */
467
0871a0b89f7c Don't return until the shell has quit. This will ensure that an exit status
Matt Johnston <matt@ucc.asn.au>
parents: 449
diff changeset
348 if (channel->readfd == FD_CLOSED
815
35183e8a7851 Improve EOF handling for half-close. Patch from Catalin Patulea
Matt Johnston <matt@ucc.asn.au>
parents: 770
diff changeset
349 && channel->writefd == FD_CLOSED
423
b2b67cfcd66e - Fix bug in child-exit handling where the wrong pid was being matched.
Matt Johnston <matt@ucc.asn.au>
parents: 416
diff changeset
350 && (ERRFD_IS_WRITE(channel) || channel->errfd == FD_CLOSED)
467
0871a0b89f7c Don't return until the shell has quit. This will ensure that an exit status
Matt Johnston <matt@ucc.asn.au>
parents: 449
diff changeset
351 && !channel->sent_close
0871a0b89f7c Don't return until the shell has quit. This will ensure that an exit status
Matt Johnston <matt@ucc.asn.au>
parents: 449
diff changeset
352 && close_allowed
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
353 && !write_pending(channel)) {
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
354 TRACE(("sending close, readfd is closed"))
397
2908122e9eed disapproval of revision '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
Matt Johnston <matt@ucc.asn.au>
parents: 396
diff changeset
355 send_msg_channel_close(channel);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
356 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
357 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
358
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
359 /* Check whether a deferred (EINPROGRESS) connect() was successful, and
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
360 * if so, set up the channel properly. Otherwise, the channel is cleaned up, so
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
361 * it is important that the channel reference isn't used after a call to this
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
362 * function */
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
363 void channel_connect_done(int result, int sock, void* user_data, const char* UNUSED(errstring)) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
364
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
365 struct Channel *channel = user_data;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
366
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
367 TRACE(("enter channel_connect_done"))
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
368
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
369 if (result == DROPBEAR_SUCCESS)
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
370 {
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
371 channel->readfd = channel->writefd = sock;
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
372 channel->conn_pending = NULL;
70
b0316ce64e4b Merging in the changes from 0.41-0.43 main Dropbear tree
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
373 send_msg_channel_open_confirmation(channel, channel->recvwindow,
b0316ce64e4b Merging in the changes from 0.41-0.43 main Dropbear tree
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
374 channel->recvmaxpacket);
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
375 TRACE(("leave channel_connect_done: success"))
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
376 }
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
377 else
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
378 {
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
379 send_msg_channel_open_failure(channel->remotechan,
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
380 SSH_OPEN_CONNECT_FAILED, "", "");
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
381 remove_channel(channel);
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
382 TRACE(("leave check_in_progress: fail"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
383 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
384 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
385
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
386
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
387 /* Send the close message and set the channel as closed */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
388 static void send_msg_channel_close(struct Channel *channel) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
389
1038
d3925ed45a85 Fix for old compilers, variable declarations at beginning of functions
Thorsten Horstmann <thorsten.horstmann@web.de>
parents: 970
diff changeset
390 TRACE(("enter send_msg_channel_close %p", (void*)channel))
652
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
391 if (channel->type->closehandler
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
392 && !channel->close_handler_done) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
393 channel->type->closehandler(channel);
652
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
394 channel->close_handler_done = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
395 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
396
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
397 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
398
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
399 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_CLOSE);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
400 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
401
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
402 encrypt_packet();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
403
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
404 channel->sent_eof = 1;
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
405 channel->sent_close = 1;
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
406 close_chan_fd(channel, channel->readfd, SHUT_RD);
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
407 close_chan_fd(channel, channel->errfd, SHUT_RDWR);
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
408 close_chan_fd(channel, channel->writefd, SHUT_WR);
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
409 TRACE(("leave send_msg_channel_close"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
410 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
411
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
412 /* call this when trans/eof channels are closed */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
413 static void send_msg_channel_eof(struct Channel *channel) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
414
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
415 TRACE(("enter send_msg_channel_eof"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
416 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
417
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
418 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_EOF);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
419 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
420
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
421 encrypt_packet();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
422
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
423 channel->sent_eof = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
424
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
425 TRACE(("leave send_msg_channel_eof"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
426 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
427
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
428 #ifndef HAVE_WRITEV
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
429 static int writechannel_fallback(struct Channel* channel, int fd, circbuffer *cbuf,
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
430 const unsigned char *UNUSED(moredata), unsigned int *morelen) {
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
431
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
432 unsigned char *circ_p1, *circ_p2;
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
433 unsigned int circ_len1, circ_len2;
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
434 ssize_t written;
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
435
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
436 if (morelen) {
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
437 /* fallback doesn't consume moredata */
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
438 *morelen = 0;
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
439 }
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
440
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
441 /* Write the first portion of the circular buffer */
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
442 cbuf_readptrs(cbuf, &circ_p1, &circ_len1, &circ_p2, &circ_len2);
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
443 written = write(fd, circ_p1, circ_len1);
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
444 if (written < 0) {
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
445 if (errno != EINTR && errno != EAGAIN) {
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
446 TRACE(("channel IO write error fd %d %s", fd, strerror(errno)))
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
447 close_chan_fd(channel, fd, SHUT_WR);
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
448 return DROPBEAR_FAILURE;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
449 }
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
450 }
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
451 cbuf_incrread(cbuf, written);
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
452 channel->recvdonelen += written;
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
453 return DROPBEAR_SUCCESS;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
454 }
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
455 #endif /* !HAVE_WRITEV */
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
456
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
457 #ifdef HAVE_WRITEV
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
458 static int writechannel_writev(struct Channel* channel, int fd, circbuffer *cbuf,
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
459 const unsigned char *moredata, unsigned int *morelen) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
460
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
461 struct iovec iov[3];
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
462 unsigned char *circ_p1, *circ_p2;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
463 unsigned int circ_len1, circ_len2;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
464 int io_count = 0;
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
465 int cbuf_written;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
466 ssize_t written;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
467
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
468 cbuf_readptrs(cbuf, &circ_p1, &circ_len1, &circ_p2, &circ_len2);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
469
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
470 if (circ_len1 > 0) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
471 TRACE(("circ1 %d", circ_len1))
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
472 iov[io_count].iov_base = circ_p1;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
473 iov[io_count].iov_len = circ_len1;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
474 io_count++;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
475 }
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
476
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
477 if (circ_len2 > 0) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
478 TRACE(("circ2 %d", circ_len2))
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
479 iov[io_count].iov_base = circ_p2;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
480 iov[io_count].iov_len = circ_len2;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
481 io_count++;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
482 }
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
483
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
484 if (morelen) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
485 assert(moredata);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
486 TRACE(("more %d", *morelen))
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
487 iov[io_count].iov_base = (void*)moredata;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
488 iov[io_count].iov_len = *morelen;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
489 io_count++;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
490 }
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
491
1075
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
492 if (io_count == 0) {
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
493 /* writechannel may sometimes be called twice in a main loop iteration.
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
494 From common_recv_msg_channel_data() then channelio().
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
495 The second call may not have any data to write, so we just return. */
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
496 TRACE(("leave writechannel, no data"))
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
497 return DROPBEAR_SUCCESS;
1075
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
498 }
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
499
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
500 if (morelen) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
501 /* Default return value, none consumed */
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
502 *morelen = 0;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
503 }
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
504
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
505 written = writev(fd, iov, io_count);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
506
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
507 if (written < 0) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
508 if (errno != EINTR && errno != EAGAIN) {
1075
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
509 TRACE(("channel IO write error fd %d %s", fd, strerror(errno)))
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
510 close_chan_fd(channel, fd, SHUT_WR);
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
511 return DROPBEAR_FAILURE;
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
512 }
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
513 }
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
514
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
515 cbuf_written = MIN(circ_len1+circ_len2, (unsigned int)written);
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
516 cbuf_incrread(cbuf, cbuf_written);
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
517 if (morelen) {
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
518 *morelen = written - cbuf_written;
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
519 }
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
520 channel->recvdonelen += written;
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
521 return DROPBEAR_SUCCESS;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
522 }
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
523 #endif /* HAVE_WRITEV */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
524
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
525 /* Called to write data out to the local side of the channel.
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
526 Writes the circular buffer contents and also the "moredata" buffer
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
527 if not null. Will ignore EAGAIN.
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
528 Returns DROPBEAR_FAILURE if writing to fd had an error and the channel is being closed, DROPBEAR_SUCCESS otherwise */
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
529 static int writechannel(struct Channel* channel, int fd, circbuffer *cbuf,
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
530 const unsigned char *moredata, unsigned int *morelen) {
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
531 int ret = DROPBEAR_SUCCESS;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
532 TRACE(("enter writechannel fd %d", fd))
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
533 #ifdef HAVE_WRITEV
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
534 ret = writechannel_writev(channel, fd, cbuf, moredata, morelen);
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
535 #else
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
536 ret = writechannel_fallback(channel, fd, cbuf, moredata, morelen);
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
537 #endif
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
538
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
539 /* Window adjust handling */
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
540 if (channel->recvdonelen >= RECV_WINDOWEXTEND) {
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
541 send_msg_channel_window_adjust(channel, channel->recvdonelen);
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
542 channel->recvwindow += channel->recvdonelen;
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
543 channel->recvdonelen = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
544 }
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
545
449
3e6c536bc023 Add -W <windowsize> argument and document it.
Matt Johnston <matt@ucc.asn.au>
parents: 448
diff changeset
546 dropbear_assert(channel->recvwindow <= opts.recv_window);
709
abd99ecd7ec2 use an empty writebuf rather than a NULL one
Matt Johnston <matt@ucc.asn.au>
parents: 707
diff changeset
547 dropbear_assert(channel->recvwindow <= cbuf_getavail(channel->writebuf));
241
c5d3ef11155f * use own assertions which should get logged properly
Matt Johnston <matt@ucc.asn.au>
parents: 221
diff changeset
548 dropbear_assert(channel->extrabuf == NULL ||
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
549 channel->recvwindow <= cbuf_getavail(channel->extrabuf));
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
550
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
551 TRACE(("leave writechannel"))
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
552 return ret;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
553 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
554
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
555
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
556 /* Set the file descriptors for the main select in session.c
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
557 * This avoid channels which don't have any window available, are closed, etc*/
1074
10f198d4a308 Make main socket nonblocking. Limit writequeue size.
Matt Johnston <matt@ucc.asn.au>
parents: 1072
diff changeset
558 void setchannelfds(fd_set *readfds, fd_set *writefds, int allow_reads) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
559
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
560 unsigned int i;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
561 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
562
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
563 for (i = 0; i < ses.chansize; i++) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
564
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
565 channel = ses.channels[i];
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
566 if (channel == NULL) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
567 continue;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
568 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
569
896
a1a97e98b0c1 Read (and enqueue) packets from interactive input even when
Matt Johnston <matt@ucc.asn.au>
parents: 815
diff changeset
570 /* Stuff to put over the wire.
a1a97e98b0c1 Read (and enqueue) packets from interactive input even when
Matt Johnston <matt@ucc.asn.au>
parents: 815
diff changeset
571 Avoid queueing data to send if we're in the middle of a
a1a97e98b0c1 Read (and enqueue) packets from interactive input even when
Matt Johnston <matt@ucc.asn.au>
parents: 815
diff changeset
572 key re-exchange (!dataallowed), but still read from the
a1a97e98b0c1 Read (and enqueue) packets from interactive input even when
Matt Johnston <matt@ucc.asn.au>
parents: 815
diff changeset
573 FD if there's the possibility of "~."" to kill an
a1a97e98b0c1 Read (and enqueue) packets from interactive input even when
Matt Johnston <matt@ucc.asn.au>
parents: 815
diff changeset
574 interactive session (the read_mangler) */
a1a97e98b0c1 Read (and enqueue) packets from interactive input even when
Matt Johnston <matt@ucc.asn.au>
parents: 815
diff changeset
575 if (channel->transwindow > 0
1074
10f198d4a308 Make main socket nonblocking. Limit writequeue size.
Matt Johnston <matt@ucc.asn.au>
parents: 1072
diff changeset
576 && ((ses.dataallowed && allow_reads) || channel->read_mangler)) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
577
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
578 if (channel->readfd >= 0) {
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
579 FD_SET(channel->readfd, readfds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
580 }
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
581
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
582 if (ERRFD_IS_READ(channel) && channel->errfd >= 0) {
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
583 FD_SET(channel->errfd, readfds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
584 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
585 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
586
397
2908122e9eed disapproval of revision '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
Matt Johnston <matt@ucc.asn.au>
parents: 396
diff changeset
587 /* Stuff from the wire */
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
588 if (channel->writefd >= 0 && cbuf_getused(channel->writebuf) > 0) {
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
589 FD_SET(channel->writefd, writefds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
590 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
591
433
c216212001fc Fix for -pedantic -ansi compilation, change // to /**/, plus some signedness
Matt Johnston <matt@ucc.asn.au>
parents: 423
diff changeset
592 if (ERRFD_IS_WRITE(channel) && channel->errfd >= 0
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
593 && cbuf_getused(channel->extrabuf) > 0) {
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
594 FD_SET(channel->errfd, writefds);
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
595 }
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
596
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
597 } /* foreach channel */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
598
9
7f77962de998 - Reworked non-channel fd handling to listener.c
Matt Johnston <matt@ucc.asn.au>
parents: 7
diff changeset
599 #ifdef USING_LISTENERS
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
600 set_listener_fds(readfds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
601 #endif
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
602
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
603 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
604
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
605 /* handle the channel EOF event, by closing the channel filedescriptor. The
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
606 * channel isn't closed yet, it is left until the incoming (from the program
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
607 * etc) FD is also EOF */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
608 void recv_msg_channel_eof() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
609
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
610 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
611
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
612 TRACE(("enter recv_msg_channel_eof"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
613
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
614 channel = getchannel_msg("EOF");
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
615
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
616 channel->recv_eof = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
617
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
618 check_close(channel);
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
619 TRACE(("leave recv_msg_channel_eof"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
620 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
621
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
622
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
623 /* Handle channel closure(), respond in kind and close the channels */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
624 void recv_msg_channel_close() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
625
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
626 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
627
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
628 TRACE(("enter recv_msg_channel_close"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
629
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
630 channel = getchannel_msg("Close");
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
631
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
632 channel->recv_eof = 1;
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
633 channel->recv_close = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
634
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
635 check_close(channel);
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
636 TRACE(("leave recv_msg_channel_close"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
637 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
638
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
639 /* Remove a channel entry, this is only executed after both sides have sent
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
640 * channel close */
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
641 static void remove_channel(struct Channel * channel) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
642
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
643 TRACE(("enter remove_channel"))
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
644 TRACE(("channel index is %d", channel->index))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
645
709
abd99ecd7ec2 use an empty writebuf rather than a NULL one
Matt Johnston <matt@ucc.asn.au>
parents: 707
diff changeset
646 cbuf_free(channel->writebuf);
abd99ecd7ec2 use an empty writebuf rather than a NULL one
Matt Johnston <matt@ucc.asn.au>
parents: 707
diff changeset
647 channel->writebuf = NULL;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
648
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
649 if (channel->extrabuf) {
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
650 cbuf_free(channel->extrabuf);
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
651 channel->extrabuf = NULL;
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
652 }
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
653
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
654
938
c88dce72f6d2 Make sure client exit messages don't get lost
Matt Johnston <matt@ucc.asn.au>
parents: 937
diff changeset
655 if (IS_DROPBEAR_SERVER || (channel->writefd != STDOUT_FILENO)) {
c88dce72f6d2 Make sure client exit messages don't get lost
Matt Johnston <matt@ucc.asn.au>
parents: 937
diff changeset
656 /* close the FDs in case they haven't been done
c88dce72f6d2 Make sure client exit messages don't get lost
Matt Johnston <matt@ucc.asn.au>
parents: 937
diff changeset
657 * yet (they might have been shutdown etc) */
c88dce72f6d2 Make sure client exit messages don't get lost
Matt Johnston <matt@ucc.asn.au>
parents: 937
diff changeset
658 TRACE(("CLOSE writefd %d", channel->writefd))
1039
d0e6dd5af46e Use m_close() which will avoid close(-1)
Matt Johnston <matt@ucc.asn.au>
parents: 1038
diff changeset
659 m_close(channel->writefd);
938
c88dce72f6d2 Make sure client exit messages don't get lost
Matt Johnston <matt@ucc.asn.au>
parents: 937
diff changeset
660 TRACE(("CLOSE readfd %d", channel->readfd))
1039
d0e6dd5af46e Use m_close() which will avoid close(-1)
Matt Johnston <matt@ucc.asn.au>
parents: 1038
diff changeset
661 m_close(channel->readfd);
938
c88dce72f6d2 Make sure client exit messages don't get lost
Matt Johnston <matt@ucc.asn.au>
parents: 937
diff changeset
662 TRACE(("CLOSE errfd %d", channel->errfd))
1039
d0e6dd5af46e Use m_close() which will avoid close(-1)
Matt Johnston <matt@ucc.asn.au>
parents: 1038
diff changeset
663 m_close(channel->errfd);
938
c88dce72f6d2 Make sure client exit messages don't get lost
Matt Johnston <matt@ucc.asn.au>
parents: 937
diff changeset
664 }
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
665
770
7577a3afc42d run closehandlers on cleanup
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
666 if (!channel->close_handler_done
7577a3afc42d run closehandlers on cleanup
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
667 && channel->type->closehandler) {
7577a3afc42d run closehandlers on cleanup
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
668 channel->type->closehandler(channel);
7577a3afc42d run closehandlers on cleanup
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
669 channel->close_handler_done = 1;
7577a3afc42d run closehandlers on cleanup
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
670 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
671
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
672 if (channel->conn_pending) {
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
673 cancel_connect(channel->conn_pending);
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
674 }
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
675
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
676 ses.channels[channel->index] = NULL;
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
677 m_free(channel);
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
678 ses.chancount--;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
679
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
680 update_channel_prio();
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
681
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
682 TRACE(("leave remove_channel"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
683 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
684
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
685 /* Handle channel specific requests, passing off to corresponding handlers
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
686 * such as chansession or x11fwd */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
687 void recv_msg_channel_request() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
688
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
689 struct Channel *channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
690
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
691 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
692
1038
d3925ed45a85 Fix for old compilers, variable declarations at beginning of functions
Thorsten Horstmann <thorsten.horstmann@web.de>
parents: 970
diff changeset
693 TRACE(("enter recv_msg_channel_request %p", (void*)channel))
652
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
694
495
cd02449b709c Don't send anything in response to a SSH_MSG_CHANNEL_REQUEST if we have
Matt Johnston <matt@ucc.asn.au>
parents: 467
diff changeset
695 if (channel->sent_close) {
cd02449b709c Don't send anything in response to a SSH_MSG_CHANNEL_REQUEST if we have
Matt Johnston <matt@ucc.asn.au>
parents: 467
diff changeset
696 TRACE(("leave recv_msg_channel_request: already closed channel"))
cd02449b709c Don't send anything in response to a SSH_MSG_CHANNEL_REQUEST if we have
Matt Johnston <matt@ucc.asn.au>
parents: 467
diff changeset
697 return;
cd02449b709c Don't send anything in response to a SSH_MSG_CHANNEL_REQUEST if we have
Matt Johnston <matt@ucc.asn.au>
parents: 467
diff changeset
698 }
cd02449b709c Don't send anything in response to a SSH_MSG_CHANNEL_REQUEST if we have
Matt Johnston <matt@ucc.asn.au>
parents: 467
diff changeset
699
652
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
700 if (channel->type->reqhandler
17962b2a6b8f - Make sure we don't use channel-specific data after it has been freed
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
701 && !channel->close_handler_done) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
702 channel->type->reqhandler(channel);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
703 } else {
970
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
704 int wantreply;
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
705 buf_eatstring(ses.payload);
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
706 wantreply = buf_getbool(ses.payload);
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
707 if (wantreply) {
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
708 send_msg_channel_failure(channel);
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
709 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
710 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
711
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
712 TRACE(("leave recv_msg_channel_request"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
713
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
714 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
715
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
716 /* Reads data from the server's program/shell/etc, and puts it in a
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
717 * channel_data packet to send.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
718 * chan is the remote channel, isextended is 0 if it is normal data, 1
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
719 * if it is extended data. if it is extended, then the type is in
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
720 * exttype */
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
721 static void send_msg_channel_data(struct Channel *channel, int isextended) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
722
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
723 int len;
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
724 size_t maxlen, size_pos;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
725 int fd;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
726
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
727 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
728
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
729 TRACE(("enter send_msg_channel_data"))
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
730 dropbear_assert(!channel->sent_close);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
731
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
732 if (isextended) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
733 fd = channel->errfd;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
734 } else {
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
735 fd = channel->readfd;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
736 }
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
737 TRACE(("enter send_msg_channel_data isextended %d fd %d", isextended, fd))
241
c5d3ef11155f * use own assertions which should get logged properly
Matt Johnston <matt@ucc.asn.au>
parents: 221
diff changeset
738 dropbear_assert(fd >= 0);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
739
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
740 maxlen = MIN(channel->transwindow, channel->transmaxpacket);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
741 /* -(1+4+4) is SSH_MSG_CHANNEL_DATA, channel number, string length, and
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
742 * exttype if is extended */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
743 maxlen = MIN(maxlen,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
744 ses.writepayload->size - 1 - 4 - 4 - (isextended ? 4 : 0));
770
7577a3afc42d run closehandlers on cleanup
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
745 TRACE(("maxlen %zd", maxlen))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
746 if (maxlen == 0) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
747 TRACE(("leave send_msg_channel_data: no window"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
748 return;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
749 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
750
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
751 buf_putbyte(ses.writepayload,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
752 isextended ? SSH_MSG_CHANNEL_EXTENDED_DATA : SSH_MSG_CHANNEL_DATA);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
753 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
754 if (isextended) {
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
755 buf_putint(ses.writepayload, SSH_EXTENDED_DATA_STDERR);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
756 }
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
757 /* a dummy size first ...*/
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
758 size_pos = ses.writepayload->pos;
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
759 buf_putint(ses.writepayload, 0);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
760
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
761 /* read the data */
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
762 len = read(fd, buf_getwriteptr(ses.writepayload, maxlen), maxlen);
722
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
763
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
764 if (len <= 0) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
765 if (len == 0 || errno != EINTR) {
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
766 /* This will also get hit in the case of EAGAIN. The only
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
767 time we expect to receive EAGAIN is when we're flushing a FD,
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
768 in which case it can be treated the same as EOF */
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
769 close_chan_fd(channel, fd, SHUT_RD);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
770 }
722
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
771 buf_setpos(ses.writepayload, 0);
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
772 buf_setlen(ses.writepayload, 0);
423
b2b67cfcd66e - Fix bug in child-exit handling where the wrong pid was being matched.
Matt Johnston <matt@ucc.asn.au>
parents: 416
diff changeset
773 TRACE(("leave send_msg_channel_data: len %d read err %d or EOF for fd %d",
b2b67cfcd66e - Fix bug in child-exit handling where the wrong pid was being matched.
Matt Johnston <matt@ucc.asn.au>
parents: 416
diff changeset
774 len, errno, fd))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
775 return;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
776 }
673
c519b78b6d1a - Don't sent SSH_MSG_UNIMPLEMENTED if we don't have ENABLE_SVR_REMOTETCPFWD
Matt Johnston <matt@ucc.asn.au>
parents: 652
diff changeset
777
722
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
778 if (channel->read_mangler) {
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
779 channel->read_mangler(channel, buf_getwriteptr(ses.writepayload, len), &len);
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
780 if (len == 0) {
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
781 buf_setpos(ses.writepayload, 0);
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
782 buf_setlen(ses.writepayload, 0);
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
783 return;
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
784 }
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
785 }
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
786
673
c519b78b6d1a - Don't sent SSH_MSG_UNIMPLEMENTED if we don't have ENABLE_SVR_REMOTETCPFWD
Matt Johnston <matt@ucc.asn.au>
parents: 652
diff changeset
787 TRACE(("send_msg_channel_data: len %d fd %d", len, fd))
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
788 buf_incrwritepos(ses.writepayload, len);
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
789 /* ... real size here */
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
790 buf_setpos(ses.writepayload, size_pos);
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
791 buf_putint(ses.writepayload, len);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
792
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
793 channel->transwindow -= len;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
794
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
795 encrypt_packet();
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
796
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
797 /* If we receive less data than we requested when flushing, we've
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
798 reached the equivalent of EOF */
433
c216212001fc Fix for -pedantic -ansi compilation, change // to /**/, plus some signedness
Matt Johnston <matt@ucc.asn.au>
parents: 423
diff changeset
799 if (channel->flushing && len < (ssize_t)maxlen)
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
800 {
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
801 TRACE(("closing from channel, flushing out."))
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
802 close_chan_fd(channel, fd, SHUT_RD);
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
803 }
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
804 TRACE(("leave send_msg_channel_data"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
805 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
806
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
807 /* We receive channel data */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
808 void recv_msg_channel_data() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
809
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
810 struct Channel *channel;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
811
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
812 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
813
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
814 common_recv_msg_channel_data(channel, channel->writefd, channel->writebuf);
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
815 }
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
816
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
817 /* Shared for data and stderr data - when we receive data, put it in a buffer
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
818 * for writing to the local file descriptor */
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
819 void common_recv_msg_channel_data(struct Channel *channel, int fd,
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
820 circbuffer * cbuf) {
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
821
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
822 unsigned int datalen;
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
823 unsigned int maxdata;
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
824 unsigned int buflen;
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
825 unsigned int len;
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
826 unsigned int consumed;
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
827 int res;
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
828
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
829 TRACE(("enter recv_msg_channel_data"))
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
830
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
831 if (channel->recv_eof) {
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 513
diff changeset
832 dropbear_exit("Received data after eof");
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
833 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
834
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
835 if (fd < 0 || !cbuf) {
365
49fcc9875045 Remove accidentally removed block (making sure to close the channel).
Matt Johnston <matt@ucc.asn.au>
parents: 364
diff changeset
836 /* If we have encountered failed write, the far side might still
49fcc9875045 Remove accidentally removed block (making sure to close the channel).
Matt Johnston <matt@ucc.asn.au>
parents: 364
diff changeset
837 * be sending data without having yet received our close notification.
49fcc9875045 Remove accidentally removed block (making sure to close the channel).
Matt Johnston <matt@ucc.asn.au>
parents: 364
diff changeset
838 * We just drop the data. */
49fcc9875045 Remove accidentally removed block (making sure to close the channel).
Matt Johnston <matt@ucc.asn.au>
parents: 364
diff changeset
839 return;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
840 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
841
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
842 datalen = buf_getint(ses.payload);
365
49fcc9875045 Remove accidentally removed block (making sure to close the channel).
Matt Johnston <matt@ucc.asn.au>
parents: 364
diff changeset
843 TRACE(("length %d", datalen))
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
844
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
845 maxdata = cbuf_getavail(cbuf);
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
846
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
847 /* Whilst the spec says we "MAY ignore data past the end" this could
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
848 * lead to corrupted file transfers etc (chunks missed etc). It's better to
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
849 * just die horribly */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
850 if (datalen > maxdata) {
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
851 dropbear_exit("Oversized packet");
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
852 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
853
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
854 dropbear_assert(channel->recvwindow >= datalen);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
855 channel->recvwindow -= datalen;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
856 dropbear_assert(channel->recvwindow <= opts.recv_window);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
857
1075
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
858 /* Attempt to write the data immediately without having to put it in the circular buffer */
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
859 consumed = datalen;
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
860 res = writechannel(channel, fd, cbuf, buf_getptr(ses.payload, datalen), &consumed);
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
861
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
862 datalen -= consumed;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
863 buf_incrpos(ses.payload, consumed);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
864
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
865
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
866 /* We may have to run throught twice, if the buffer wraps around. Can't
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
867 * just "leave it for next time" like with writechannel, since this
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
868 * is payload data.
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
869 * If the writechannel() failed then remaining data is discarded */
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
870 if (res == DROPBEAR_SUCCESS) {
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
871 len = datalen;
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
872 while (len > 0) {
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
873 buflen = cbuf_writelen(cbuf);
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
874 buflen = MIN(buflen, len);
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
875
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
876 memcpy(cbuf_writeptr(cbuf, buflen),
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
877 buf_getptr(ses.payload, buflen), buflen);
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
878 cbuf_incrwrite(cbuf, buflen);
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
879 buf_incrpos(ses.payload, buflen);
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
880 len -= buflen;
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
881 }
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
882 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
883
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
884 TRACE(("leave recv_msg_channel_data"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
885 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
886
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
887 /* Increment the outgoing data window for a channel - the remote end limits
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
888 * the amount of data which may be transmitted, this window is decremented
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
889 * as data is sent, and incremented upon receiving window-adjust messages */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
890 void recv_msg_channel_window_adjust() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
891
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
892 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
893 unsigned int incr;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
894
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
895 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
896
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
897 incr = buf_getint(ses.payload);
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
898 TRACE(("received window increment %d", incr))
448
9c61e7af0156 Rearrange the channel buffer sizes into three neat use-editable values in
Matt Johnston <matt@ucc.asn.au>
parents: 439
diff changeset
899 incr = MIN(incr, TRANS_MAX_WIN_INCR);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
900
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
901 channel->transwindow += incr;
448
9c61e7af0156 Rearrange the channel buffer sizes into three neat use-editable values in
Matt Johnston <matt@ucc.asn.au>
parents: 439
diff changeset
902 channel->transwindow = MIN(channel->transwindow, TRANS_MAX_WINDOW);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
903
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
904 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
905
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
906 /* Increment the incoming data window for a channel, and let the remote
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
907 * end know */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
908 static void send_msg_channel_window_adjust(struct Channel* channel,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
909 unsigned int incr) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
910
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
911 TRACE(("sending window adjust %d", incr))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
912 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
913
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
914 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_WINDOW_ADJUST);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
915 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
916 buf_putint(ses.writepayload, incr);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
917
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
918 encrypt_packet();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
919 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
920
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
921 /* Handle a new channel request, performing any channel-type-specific setup */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
922 void recv_msg_channel_open() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
923
1094
c45d65392c1a Fix pointer differ in signess warnings [-Werror=pointer-sign]
Gaël PORTAY <gael.portay@gmail.com>
parents: 1079
diff changeset
924 char *type;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
925 unsigned int typelen;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
926 unsigned int remotechan, transwindow, transmaxpacket;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
927 struct Channel *channel;
7
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
928 const struct ChanType **cp;
6
ab00ef513e97 Sorted out the first channel init issues.
Matt Johnston <matt@ucc.asn.au>
parents: 4
diff changeset
929 const struct ChanType *chantype;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
930 unsigned int errtype = SSH_OPEN_UNKNOWN_CHANNEL_TYPE;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
931 int ret;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
932
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
933
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
934 TRACE(("enter recv_msg_channel_open"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
935
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
936 /* get the packet contents */
1122
aaf576b27a10 Merge pull request #13 from gazoo74/fix-warnings
Matt Johnston <matt@ucc.asn.au>
parents: 1098
diff changeset
937 type = buf_getstring(ses.payload, &typelen);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
938
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
939 remotechan = buf_getint(ses.payload);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
940 transwindow = buf_getint(ses.payload);
448
9c61e7af0156 Rearrange the channel buffer sizes into three neat use-editable values in
Matt Johnston <matt@ucc.asn.au>
parents: 439
diff changeset
941 transwindow = MIN(transwindow, TRANS_MAX_WINDOW);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
942 transmaxpacket = buf_getint(ses.payload);
448
9c61e7af0156 Rearrange the channel buffer sizes into three neat use-editable values in
Matt Johnston <matt@ucc.asn.au>
parents: 439
diff changeset
943 transmaxpacket = MIN(transmaxpacket, TRANS_MAX_PAYLOAD_LEN);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
944
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
945 /* figure what type of packet it is */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
946 if (typelen > MAX_NAME_LEN) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
947 goto failure;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
948 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
949
7
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
950 /* Get the channel type. Client and server style invokation will set up a
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
951 * different list for ses.chantypes at startup. We just iterate through
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
952 * this list and find the matching name */
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
953 for (cp = &ses.chantypes[0], chantype = (*cp);
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
954 chantype != NULL;
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
955 cp++, chantype = (*cp)) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
956 if (strcmp(type, chantype->name) == 0) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
957 break;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
958 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
959 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
960
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
961 if (chantype == NULL) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
962 TRACE(("No matching type for '%s'", type))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
963 goto failure;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
964 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
965
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
966 TRACE(("matched type '%s'", type))
7
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
967
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
968 /* create the channel */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
969 channel = newchannel(remotechan, chantype, transwindow, transmaxpacket);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
970
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
971 if (channel == NULL) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
972 TRACE(("newchannel returned NULL"))
1166
b0f351edf370 Send SSH_OPEN_RESOURCE_SHORTAGE response when too many channels open
Matt Johnston <matt@ucc.asn.au>
parents: 1165
diff changeset
973 errtype = SSH_OPEN_RESOURCE_SHORTAGE;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
974 goto failure;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
975 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
976
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
977 if (channel->type->inithandler) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
978 ret = channel->type->inithandler(channel);
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
979 if (ret == SSH_OPEN_IN_PROGRESS) {
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
980 /* We'll send the confirmation later */
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
981 goto cleanup;
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
982 }
6
ab00ef513e97 Sorted out the first channel init issues.
Matt Johnston <matt@ucc.asn.au>
parents: 4
diff changeset
983 if (ret > 0) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
984 errtype = ret;
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
985 remove_channel(channel);
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
986 TRACE(("inithandler returned failure %d", ret))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
987 goto failure;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
988 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
989 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
990
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
991 if (channel->prio == DROPBEAR_CHANNEL_PRIO_EARLY) {
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
992 channel->prio = DROPBEAR_CHANNEL_PRIO_BULK;
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
993 }
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
994
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
995 /* success */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
996 send_msg_channel_open_confirmation(channel, channel->recvwindow,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
997 channel->recvmaxpacket);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
998 goto cleanup;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
999
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1000 failure:
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1001 TRACE(("recv_msg_channel_open failure"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1002 send_msg_channel_open_failure(remotechan, errtype, "", "");
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1003
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1004 cleanup:
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1005 m_free(type);
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
1006
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
1007 update_channel_prio();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1008
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1009 TRACE(("leave recv_msg_channel_open"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1010 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1011
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1012 /* Send a failure message */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1013 void send_msg_channel_failure(struct Channel *channel) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1014
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1015 TRACE(("enter send_msg_channel_failure"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1016 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1017
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1018 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_FAILURE);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1019 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1020
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1021 encrypt_packet();
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1022 TRACE(("leave send_msg_channel_failure"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1023 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1024
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1025 /* Send a success message */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1026 void send_msg_channel_success(struct Channel *channel) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1027
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1028 TRACE(("enter send_msg_channel_success"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1029 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1030
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1031 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_SUCCESS);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1032 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1033
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1034 encrypt_packet();
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1035 TRACE(("leave send_msg_channel_success"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1036 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1037
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1038 /* Send a channel open failure message, with a corresponding reason
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1039 * code (usually resource shortage or unknown chan type) */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1040 static void send_msg_channel_open_failure(unsigned int remotechan,
1098
f95b6e87cd0c Turn send_msg_channel_open_failure()'s text and lang into const char *
Gaël PORTAY <gael.portay@gmail.com>
parents: 1097
diff changeset
1041 int reason, const char *text, const char *lang) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1042
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1043 TRACE(("enter send_msg_channel_open_failure"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1044 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1045
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1046 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_OPEN_FAILURE);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1047 buf_putint(ses.writepayload, remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1048 buf_putint(ses.writepayload, reason);
1122
aaf576b27a10 Merge pull request #13 from gazoo74/fix-warnings
Matt Johnston <matt@ucc.asn.au>
parents: 1098
diff changeset
1049 buf_putstring(ses.writepayload, text, strlen(text));
aaf576b27a10 Merge pull request #13 from gazoo74/fix-warnings
Matt Johnston <matt@ucc.asn.au>
parents: 1098
diff changeset
1050 buf_putstring(ses.writepayload, lang, strlen(lang));
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1051
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1052 encrypt_packet();
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1053 TRACE(("leave send_msg_channel_open_failure"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1054 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1055
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1056 /* Confirm a channel open, and let the remote end know what number we've
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1057 * allocated and the receive parameters */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1058 static void send_msg_channel_open_confirmation(struct Channel* channel,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1059 unsigned int recvwindow,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1060 unsigned int recvmaxpacket) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1061
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1062 TRACE(("enter send_msg_channel_open_confirmation"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1063 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1064
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1065 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1066 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1067 buf_putint(ses.writepayload, channel->index);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1068 buf_putint(ses.writepayload, recvwindow);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1069 buf_putint(ses.writepayload, recvmaxpacket);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1070
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1071 encrypt_packet();
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1072 TRACE(("leave send_msg_channel_open_confirmation"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1073 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1074
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1075 /* close a fd, how is SHUT_RD or SHUT_WR */
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1076 static void close_chan_fd(struct Channel *channel, int fd, int how) {
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1077
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1078 int closein = 0, closeout = 0;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1079
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1080 if (channel->type->sepfds) {
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1081 TRACE(("SHUTDOWN(%d, %d)", fd, how))
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1082 shutdown(fd, how);
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1083 if (how == 0) {
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1084 closeout = 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1085 } else {
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1086 closein = 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1087 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1088 } else {
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1089 TRACE(("CLOSE some fd %d", fd))
1039
d0e6dd5af46e Use m_close() which will avoid close(-1)
Matt Johnston <matt@ucc.asn.au>
parents: 1038
diff changeset
1090 m_close(fd);
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1091 closein = closeout = 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1092 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1093
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1094 if (closeout && (fd == channel->readfd)) {
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1095 channel->readfd = FD_CLOSED;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1096 }
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1097 if (closeout && ERRFD_IS_READ(channel) && (fd == channel->errfd)) {
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1098 channel->errfd = FD_CLOSED;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1099 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1100
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1101 if (closein && fd == channel->writefd) {
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1102 channel->writefd = FD_CLOSED;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1103 }
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1104 if (closein && ERRFD_IS_WRITE(channel) && (fd == channel->errfd)) {
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1105 channel->errfd = FD_CLOSED;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1106 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1107
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1108 /* if we called shutdown on it and all references are gone, then we
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1109 * need to close() it to stop it lingering */
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1110 if (channel->type->sepfds && channel->readfd == FD_CLOSED
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1111 && channel->writefd == FD_CLOSED && channel->errfd == FD_CLOSED) {
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1112 TRACE(("CLOSE (finally) of %d", fd))
1039
d0e6dd5af46e Use m_close() which will avoid close(-1)
Matt Johnston <matt@ucc.asn.au>
parents: 1038
diff changeset
1113 m_close(fd);
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1114 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1115 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1116
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1117
156
8c2b3506f112 Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents: 109
diff changeset
1118 #if defined(USING_LISTENERS) || defined(DROPBEAR_CLIENT)
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1119 /* Create a new channel, and start the open request. This is intended
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1120 * for X11, agent, tcp forwarding, and should be filled with channel-specific
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1121 * options, with the calling function calling encrypt_packet() after
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1122 * completion. It is mandatory for the caller to encrypt_packet() if
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
1123 * a channel is returned. NULL is returned on failure. */
9
7f77962de998 - Reworked non-channel fd handling to listener.c
Matt Johnston <matt@ucc.asn.au>
parents: 7
diff changeset
1124 int send_msg_channel_open_init(int fd, const struct ChanType *type) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1125
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1126 struct Channel* chan;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1127
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1128 TRACE(("enter send_msg_channel_open_init()"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1129 chan = newchannel(0, type, 0, 0);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1130 if (!chan) {
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1131 TRACE(("leave send_msg_channel_open_init() - FAILED in newchannel()"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1132 return DROPBEAR_FAILURE;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1133 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1134
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
1135 /* Outbound opened channels don't make use of in-progress connections,
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
1136 * we can set it up straight away */
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
1137
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1138 /* set fd non-blocking */
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
1139 setnonblocking(fd);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1140
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
1141 chan->writefd = chan->readfd = fd;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1142 ses.maxfd = MAX(ses.maxfd, fd);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1143
243
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1144 chan->await_open = 1;
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1145
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1146 /* now open the channel connection */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1147 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1148
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1149 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_OPEN);
1122
aaf576b27a10 Merge pull request #13 from gazoo74/fix-warnings
Matt Johnston <matt@ucc.asn.au>
parents: 1098
diff changeset
1150 buf_putstring(ses.writepayload, type->name, strlen(type->name));
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1151 buf_putint(ses.writepayload, chan->index);
449
3e6c536bc023 Add -W <windowsize> argument and document it.
Matt Johnston <matt@ucc.asn.au>
parents: 448
diff changeset
1152 buf_putint(ses.writepayload, opts.recv_window);
906
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
1153 buf_putint(ses.writepayload, RECV_MAX_CHANNEL_DATA_LEN);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1154
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1155 TRACE(("leave send_msg_channel_open_init()"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1156 return DROPBEAR_SUCCESS;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1157 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1158
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1159 /* Confirmation that our channel open request (for forwardings) was
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1160 * successful*/
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1161 void recv_msg_channel_open_confirmation() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1162
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1163 struct Channel * channel;
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1164 int ret;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1165
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1166 TRACE(("enter recv_msg_channel_open_confirmation"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1167
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
1168 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1169
243
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1170 if (!channel->await_open) {
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 513
diff changeset
1171 dropbear_exit("Unexpected channel reply");
243
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1172 }
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1173 channel->await_open = 0;
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1174
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1175 channel->remotechan = buf_getint(ses.payload);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1176 channel->transwindow = buf_getint(ses.payload);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1177 channel->transmaxpacket = buf_getint(ses.payload);
13
db2c8e6fb284 Fixed stupid agentfwd error (using the listening FD, not the accepted on. gah)
Matt Johnston <matt@ucc.asn.au>
parents: 9
diff changeset
1178
187
c44df7123b0a compile fix when TRACE debugging is enabled
Matt Johnston <matt@ucc.asn.au>
parents: 179
diff changeset
1179 TRACE(("new chan remote %d local %d",
c44df7123b0a compile fix when TRACE debugging is enabled
Matt Johnston <matt@ucc.asn.au>
parents: 179
diff changeset
1180 channel->remotechan, channel->index))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1181
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1182 /* Run the inithandler callback */
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1183 if (channel->type->inithandler) {
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1184 ret = channel->type->inithandler(channel);
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1185 if (ret > 0) {
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
1186 remove_channel(channel);
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1187 TRACE(("inithandler returned failure %d", ret))
944
2e402a09e21e Avoid use-after-free when channel inithandler fails. Thanks to Coverity
Matt Johnston <matt@ucc.asn.au>
parents: 941
diff changeset
1188 return;
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1189 }
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1190 }
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1191
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
1192 if (channel->prio == DROPBEAR_CHANNEL_PRIO_EARLY) {
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
1193 channel->prio = DROPBEAR_CHANNEL_PRIO_BULK;
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
1194 }
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
1195 update_channel_prio();
13
db2c8e6fb284 Fixed stupid agentfwd error (using the listening FD, not the accepted on. gah)
Matt Johnston <matt@ucc.asn.au>
parents: 9
diff changeset
1196
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 156
diff changeset
1197 TRACE(("leave recv_msg_channel_open_confirmation"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1198 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1199
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1200 /* Notification that our channel open request failed */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1201 void recv_msg_channel_open_failure() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1202
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1203 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1204
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
1205 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1206
243
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1207 if (!channel->await_open) {
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 513
diff changeset
1208 dropbear_exit("Unexpected channel reply");
243
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1209 }
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1210 channel->await_open = 0;
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1211
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
1212 remove_channel(channel);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1213 }
156
8c2b3506f112 Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents: 109
diff changeset
1214 #endif /* USING_LISTENERS */
937
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1215
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1216 void send_msg_request_success() {
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1217 CHECKCLEARTOWRITE();
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1218 buf_putbyte(ses.writepayload, SSH_MSG_REQUEST_SUCCESS);
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1219 encrypt_packet();
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1220 }
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1221
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1222 void send_msg_request_failure() {
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1223 CHECKCLEARTOWRITE();
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1224 buf_putbyte(ses.writepayload, SSH_MSG_REQUEST_FAILURE);
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1225 encrypt_packet();
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1226 }
970
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1227
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1228 struct Channel* get_any_ready_channel() {
1038
d3925ed45a85 Fix for old compilers, variable declarations at beginning of functions
Thorsten Horstmann <thorsten.horstmann@web.de>
parents: 970
diff changeset
1229 size_t i;
970
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1230 if (ses.chancount == 0) {
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1231 return NULL;
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1232 }
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1233 for (i = 0; i < ses.chansize; i++) {
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1234 struct Channel *chan = ses.channels[i];
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1235 if (chan
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1236 && !(chan->sent_eof || chan->recv_eof)
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
1237 && !(chan->await_open)) {
970
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1238 return chan;
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1239 }
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1240 }
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1241 return NULL;
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1242 }
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1243
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1244 void start_send_channel_request(struct Channel *channel,
1097
93e29b0ef8dc Turn start_send_channel_request()'s type argument into char *
Gaël PORTAY <gael.portay@gmail.com>
parents: 1094
diff changeset
1245 char *type) {
970
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1246
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1247 CHECKCLEARTOWRITE();
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1248 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_REQUEST);
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1249 buf_putint(ses.writepayload, channel->remotechan);
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1250
1122
aaf576b27a10 Merge pull request #13 from gazoo74/fix-warnings
Matt Johnston <matt@ucc.asn.au>
parents: 1098
diff changeset
1251 buf_putstring(ses.writepayload, type, strlen(type));
970
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1252
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1253 }