annotate common-channel.c @ 1902:4a6725ac957c

Revert "Don't include sk keys at all in KEX list" This reverts git commit f972813ecdc7bb981d25b5a63638bd158f1c8e72. The sk algorithms need to remain in the sigalgs list so that they are included in the server-sig-algs ext-info message sent by the server. RFC8308 for server-sig-algs requires that all algorithms are listed (though OpenSSH client 8.4p1 tested doesn't require that)
author Matt Johnston <matt@ucc.asn.au>
date Thu, 24 Mar 2022 13:42:08 +0800
parents 1d86a58fb52d
children
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"
9
7f77962de998 - Reworked non-channel fd handling to listener.c
Matt Johnston <matt@ucc.asn.au>
parents: 7
diff changeset
35 #include "listener.h"
449
3e6c536bc023 Add -W <windowsize> argument and document it.
Matt Johnston <matt@ucc.asn.au>
parents: 448
diff changeset
36 #include "runopts.h"
1032
0da8ba489c23 Move generic network routines to netio.c
Matt Johnston <matt@ucc.asn.au>
parents: 1025
diff changeset
37 #include "netio.h"
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
38
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
39 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
40 const char *text, const char *lang);
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
41 static void send_msg_channel_open_confirmation(const struct Channel* channel,
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
42 unsigned int recvwindow,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
43 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
44 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
45 const unsigned char *moredata, unsigned int *morelen);
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
46 static void send_msg_channel_window_adjust(const struct Channel *channel,
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
47 unsigned int incr);
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
48 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
49 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
50 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
51 static void remove_channel(struct Channel *channel);
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
52 static unsigned int write_pending(const struct Channel * channel);
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
53 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
54 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
55
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
56 #define FD_UNINIT (-2)
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
57 #define FD_CLOSED (-1)
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
58
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
59 #define ERRFD_IS_READ(channel) ((channel)->extrabuf == NULL)
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
60 #define ERRFD_IS_WRITE(channel) (!ERRFD_IS_READ(channel))
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
61
906
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
62 /* 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
63 * 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
64 * 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
65 * 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
66 */
4696755c4cac A few fixes for cases where compression increases payload sizes, and
Matt Johnston <matt@ucc.asn.au>
parents: 896
diff changeset
67 #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
68
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
69 /* Initialise all the channels */
6
ab00ef513e97 Sorted out the first channel init issues.
Matt Johnston <matt@ucc.asn.au>
parents: 4
diff changeset
70 void chaninitialise(const struct ChanType *chantypes[]) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
71
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
72 /* 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
73 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
74 ses.chansize = 1;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
75 ses.channels[0] = NULL;
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
76 ses.chancount = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
77
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
78 ses.chantypes = chantypes;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
79
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1192
diff changeset
80 #if DROPBEAR_LISTENERS
9
7f77962de998 - Reworked non-channel fd handling to listener.c
Matt Johnston <matt@ucc.asn.au>
parents: 7
diff changeset
81 listeners_initialise();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
82 #endif
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
83
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 /* Clean up channels, freeing allocated memory */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
87 void chancleanup() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
88
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
89 unsigned int i;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
90
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
91 TRACE(("enter chancleanup"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
92 for (i = 0; i < ses.chansize; i++) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
93 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
94 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
95 remove_channel(ses.channels[i]);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
96 }
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 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
99 TRACE(("leave chancleanup"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
100 }
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 /* 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
103 /* 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
104 * 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
105 * 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
106 static struct Channel* newchannel(unsigned int remotechan,
7
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
107 const struct ChanType *type,
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
108 unsigned int transwindow, unsigned int transmaxpacket) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
109
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
110 struct Channel * newchan;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
111 unsigned int i, j;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
112
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
113 TRACE(("enter newchannel"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
114
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
115 /* first see if we can use existing channels */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
116 for (i = 0; i < ses.chansize; i++) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
117 if (ses.channels[i] == NULL) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
118 break;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
119 }
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 /* otherwise extend the list */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
123 if (i == ses.chansize) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
124 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
125 TRACE(("leave newchannel: max chans reached"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
126 return NULL;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
127 }
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 /* extend the channels */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
130 ses.channels = (struct Channel**)m_realloc(ses.channels,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
131 (ses.chansize+CHAN_EXTEND_SIZE)*sizeof(struct Channel*));
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
132
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
133 ses.chansize += CHAN_EXTEND_SIZE;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
134
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
135 /* set the new channels to null */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
136 for (j = i; j < ses.chansize; j++) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
137 ses.channels[j] = NULL;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
138 }
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 newchan = (struct Channel*)m_malloc(sizeof(struct Channel));
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
143 newchan->type = type;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
144 newchan->index = i;
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
145 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
146 newchan->sent_eof = newchan->recv_eof = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
147
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
148 newchan->remotechan = remotechan;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
149 newchan->transwindow = transwindow;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
150 newchan->transmaxpacket = transmaxpacket;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
151
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
152 newchan->typedata = NULL;
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
153 newchan->writefd = FD_UNINIT;
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
154 newchan->readfd = FD_UNINIT;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
155 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
156 newchan->await_open = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
157
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
158 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
159 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
160
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
161 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
162 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
163 newchan->recvmaxpacket = RECV_MAX_CHANNEL_DATA_LEN;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
164
1859
1d86a58fb52d Leave non-interactive at default QoS class
Matt Johnston <matt@ucc.asn.au>
parents: 1835
diff changeset
165 newchan->prio = DROPBEAR_PRIO_NORMAL;
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
166
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
167 ses.channels[i] = newchan;
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
168 ses.chancount++;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
169
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
170 TRACE(("leave newchannel"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
171
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
172 return newchan;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
173 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
174
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
175 /* 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
176 * 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
177 * 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
178 * channel */
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
179 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
180
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
181 unsigned int chan;
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
182
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
183 chan = buf_getint(ses.payload);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
184 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
185 if (kind) {
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
186 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
187 } else {
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
188 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
189 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
190 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
191 return ses.channels[chan];
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
192 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
193
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
194 struct Channel* getchannel() {
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
195 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
196 }
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
197
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
198 /* Iterate through the channels, performing IO if available */
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
199 void channelio(const fd_set *readfds, const fd_set *writefds) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
200
936
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
201 /* Listeners such as TCP, X11, agent-auth */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
202 struct Channel *channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
203 unsigned int i;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
204
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
205 /* foreach channel */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
206 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
207 /* 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
208 int do_check_close = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
209
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
210 channel = ses.channels[i];
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
211 if (channel == NULL) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
212 /* only process in-use channels */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
213 continue;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
214 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
215
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
216 /* 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
217 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
218 TRACE(("send normal readfd"))
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
219 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
220 do_check_close = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
221 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
222
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
223 /* 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
224 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
225 && 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
226 TRACE(("send normal errfd"))
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
227 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
228 do_check_close = 1;
395
dc37bd8563e8 disapproval of revision '5fdf69ca60d1683cdd9f4c2595134bed26394834'
Matt Johnston <matt@ucc.asn.au>
parents: 394
diff changeset
229 }
dc37bd8563e8 disapproval of revision '5fdf69ca60d1683cdd9f4c2595134bed26394834'
Matt Johnston <matt@ucc.asn.au>
parents: 394
diff changeset
230
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
231 /* 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
232 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
233 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
234 do_check_close = 1;
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
235 }
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
236
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
237 /* stderr for client mode */
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
238 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
239 && 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
240 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
241 do_check_close = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
242 }
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
243
36eacc322e00 Make sure the check_close() handler runs when a server child process exits
Matt Johnston <matt@ucc.asn.au>
parents: 944
diff changeset
244 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
245 /* 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
246 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
247 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
248
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
249 /* 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
250 if (do_check_close) {
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
251 check_close(channel);
d93a6bcf616f Improve handling lots of concurrent forwarded connections. Increase
Matt Johnston <matt@ucc.asn.au>
parents: 906
diff changeset
252 }
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
253 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
254
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1192
diff changeset
255 #if DROPBEAR_LISTENERS
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
256 handle_listeners(readfds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
257 #endif
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
258 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
259
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
260
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
261 /* 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
262 * stderr of a channel's endpoint. */
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
263 static unsigned int write_pending(const struct Channel * channel) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
264
709
abd99ecd7ec2 use an empty writebuf rather than a NULL one
Matt Johnston <matt@ucc.asn.au>
parents: 707
diff changeset
265 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
266 return 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
267 } else if (channel->errfd >= 0 && channel->extrabuf &&
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
268 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
269 return 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
270 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
271 return 0;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
272 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
273
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
274
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
275 /* EOF/close handling */
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
276 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
277 int close_allowed = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
278
731
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 722
diff changeset
279 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
280 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
281 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
282 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
283 channel->writebuf ? cbuf_getused(channel->writebuf) : 0,
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
284 channel->extrabuf ? cbuf_getused(channel->extrabuf) : 0))
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
285
504
950c38b854a1 Don't use // style comments
Matt Johnston <matt@ucc.asn.au>
parents: 495
diff changeset
286 /* 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
287 once that has been triggered. this is only used for a server "session"
1835
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
288 channel, to ensure that the shell has exited (and the exit status
504
950c38b854a1 Don't use // style comments
Matt Johnston <matt@ucc.asn.au>
parents: 495
diff changeset
289 retrieved) before we close things up. */
1835
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
290 if (!channel->type->check_close
1625
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
291 || channel->sent_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
292 || 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
293 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
294 }
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
295
1835
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
296 /* In flushing mode we close FDs as soon as pipes are empty.
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
297 This is used to drain out FDs when the process exits, in the case
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
298 where the FD doesn't have EOF - "sleep 10&echo hello" case */
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
299 if (channel->flushing) {
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
300 if (channel->readfd >= 0 && !fd_read_pending(channel->readfd)) {
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
301 close_chan_fd(channel, channel->readfd, SHUT_RD);
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
302 }
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
303 if (ERRFD_IS_READ(channel)
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
304 && channel->errfd >= 0 && !fd_read_pending(channel->errfd)) {
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
305 close_chan_fd(channel, channel->errfd, SHUT_RD);
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
306 }
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
diff changeset
307 }
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1829
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
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
324 /* 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
325 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
326 && channel->readfd == FD_CLOSED
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
327 && (ERRFD_IS_WRITE(channel) || channel->errfd == FD_CLOSED)) {
397
2908122e9eed disapproval of revision '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
Matt Johnston <matt@ucc.asn.au>
parents: 396
diff changeset
328 send_msg_channel_eof(channel);
2908122e9eed disapproval of revision '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
Matt Johnston <matt@ucc.asn.au>
parents: 396
diff changeset
329 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
330
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
331 /* 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
332 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
333 && 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
334 && (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
335 && !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
336 && close_allowed
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
337 && !write_pending(channel)) {
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
338 TRACE(("sending close, readfd is closed"))
397
2908122e9eed disapproval of revision '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
Matt Johnston <matt@ucc.asn.au>
parents: 396
diff changeset
339 send_msg_channel_close(channel);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
340 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
341 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
342
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
343 /* 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
344 * 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
345 * 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
346 * function */
1800
c584b5602bd8 Return errstring on connect failure
Matt Johnston <matt@ucc.asn.au>
parents: 1625
diff changeset
347 void channel_connect_done(int result, int sock, void* user_data, const char* errstring) {
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
348 struct Channel *channel = user_data;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
349
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
350 TRACE(("enter channel_connect_done"))
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
351
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
352 if (result == DROPBEAR_SUCCESS)
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
353 {
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
354 channel->readfd = channel->writefd = sock;
1829
a7cc3332d8ab Replace ChanType.sepfds with Channel.bidir_fd
Matt Johnston <matt@ucc.asn.au>
parents: 1828
diff changeset
355 channel->bidir_fd = 1;
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
356 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
357 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
358 channel->recvmaxpacket);
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
359 TRACE(("leave channel_connect_done: success"))
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
360 }
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
361 else
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
362 {
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
363 send_msg_channel_open_failure(channel->remotechan,
1800
c584b5602bd8 Return errstring on connect failure
Matt Johnston <matt@ucc.asn.au>
parents: 1625
diff changeset
364 SSH_OPEN_CONNECT_FAILED, errstring, "");
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
365 remove_channel(channel);
1800
c584b5602bd8 Return errstring on connect failure
Matt Johnston <matt@ucc.asn.au>
parents: 1625
diff changeset
366 TRACE(("leave check_in_progress: fail. internal errstring: %s", errstring))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
367 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
368 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
369
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
370
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
371 /* 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
372 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
373
1038
d3925ed45a85 Fix for old compilers, variable declarations at beginning of functions
Thorsten Horstmann <thorsten.horstmann@web.de>
parents: 970
diff changeset
374 TRACE(("enter send_msg_channel_close %p", (void*)channel))
1625
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
375 if (channel->type->closehandler) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
376 channel->type->closehandler(channel);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
377 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
378
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
379 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
380
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
381 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_CLOSE);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
382 buf_putint(ses.writepayload, channel->remotechan);
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 encrypt_packet();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
385
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
386 channel->sent_eof = 1;
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
387 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
388 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
389 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
390 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
391 TRACE(("leave send_msg_channel_close"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
392 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
393
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
394 /* call this when trans/eof channels are closed */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
395 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
396
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
397 TRACE(("enter send_msg_channel_eof"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
398 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
399
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
400 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_EOF);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
401 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
402
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
403 encrypt_packet();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
404
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
405 channel->sent_eof = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
406
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
407 TRACE(("leave send_msg_channel_eof"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
408 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
409
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
410 #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
411 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
412 const unsigned char *UNUSED(moredata), unsigned int *morelen) {
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
413
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
414 unsigned char *circ_p1, *circ_p2;
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
415 unsigned int circ_len1, circ_len2;
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
416 ssize_t written;
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
417
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
418 if (morelen) {
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
419 /* fallback doesn't consume moredata */
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
420 *morelen = 0;
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
421 }
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
422
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
423 /* Write the first portion of the circular buffer */
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
424 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
425 written = write(fd, circ_p1, circ_len1);
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
426 if (written < 0) {
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
427 if (errno != EINTR && errno != EAGAIN) {
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
428 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
429 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
430 return DROPBEAR_FAILURE;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
431 }
1192
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
432 } else {
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
433 cbuf_incrread(cbuf, written);
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
434 channel->recvdonelen += written;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
435 }
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
436 return DROPBEAR_SUCCESS;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
437 }
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
438 #endif /* !HAVE_WRITEV */
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 #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
441 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
442 const unsigned char *moredata, unsigned int *morelen) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
443
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
444 struct iovec iov[3];
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
445 unsigned char *circ_p1, *circ_p2;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
446 unsigned int circ_len1, circ_len2;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
447 int io_count = 0;
1192
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
448
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
449 ssize_t written;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
450
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
451 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
452
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
453 if (circ_len1 > 0) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
454 TRACE(("circ1 %d", circ_len1))
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
455 iov[io_count].iov_base = circ_p1;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
456 iov[io_count].iov_len = circ_len1;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
457 io_count++;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
458 }
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
459
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
460 if (circ_len2 > 0) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
461 TRACE(("circ2 %d", circ_len2))
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
462 iov[io_count].iov_base = circ_p2;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
463 iov[io_count].iov_len = circ_len2;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
464 io_count++;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
465 }
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
466
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
467 if (morelen) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
468 assert(moredata);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
469 TRACE(("more %d", *morelen))
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
470 iov[io_count].iov_base = (void*)moredata;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
471 iov[io_count].iov_len = *morelen;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
472 io_count++;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
473 }
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
474
1075
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
475 if (io_count == 0) {
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
476 /* 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
477 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
478 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
479 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
480 return DROPBEAR_SUCCESS;
1075
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
481 }
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
482
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
483 if (morelen) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
484 /* Default return value, none consumed */
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
485 *morelen = 0;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
486 }
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
487
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
488 written = writev(fd, iov, io_count);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
489
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
490 if (written < 0) {
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
491 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
492 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
493 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
494 return DROPBEAR_FAILURE;
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
495 }
1192
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
496 } else {
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
497 int cbuf_written = MIN(circ_len1+circ_len2, (unsigned int)written);
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
498 cbuf_incrread(cbuf, cbuf_written);
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
499 if (morelen) {
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
500 *morelen = written - cbuf_written;
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
501 }
af940cefdba1 Fix "Avoid queueing into circbuffer when the channel is about to close"
Matt Johnston <matt@ucc.asn.au>
parents: 1191
diff changeset
502 channel->recvdonelen += written;
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
503 }
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
504 return DROPBEAR_SUCCESS;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
505 }
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
506 #endif /* HAVE_WRITEV */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
507
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
508 /* 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
509 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
510 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
511 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
512 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
513 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
514 int ret = DROPBEAR_SUCCESS;
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
515 TRACE(("enter writechannel fd %d", fd))
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
516 #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
517 ret = writechannel_writev(channel, fd, cbuf, moredata, morelen);
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
518 #else
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
519 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
520 #endif
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
521
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
522 /* Window adjust handling */
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
523 if (channel->recvdonelen >= RECV_WINDOWEXTEND) {
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
524 send_msg_channel_window_adjust(channel, channel->recvdonelen);
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
525 channel->recvwindow += channel->recvdonelen;
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
526 channel->recvdonelen = 0;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
527 }
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
528
449
3e6c536bc023 Add -W <windowsize> argument and document it.
Matt Johnston <matt@ucc.asn.au>
parents: 448
diff changeset
529 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
530 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
531 dropbear_assert(channel->extrabuf == NULL ||
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
532 channel->recvwindow <= cbuf_getavail(channel->extrabuf));
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
533
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
534 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
535 return ret;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
536 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
537
1079
acf444bcb115 Fix no-writev fallback
Matt Johnston <matt@ucc.asn.au>
parents: 1075
diff changeset
538
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
539 /* 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
540 * 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
541 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
542
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
543 unsigned int i;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
544 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
545
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
546 for (i = 0; i < ses.chansize; i++) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
547
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
548 channel = ses.channels[i];
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
549 if (channel == NULL) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
550 continue;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
551 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
552
896
a1a97e98b0c1 Read (and enqueue) packets from interactive input even when
Matt Johnston <matt@ucc.asn.au>
parents: 815
diff changeset
553 /* 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
554 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
555 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
556 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
557 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
558 if (channel->transwindow > 0
1074
10f198d4a308 Make main socket nonblocking. Limit writequeue size.
Matt Johnston <matt@ucc.asn.au>
parents: 1072
diff changeset
559 && ((ses.dataallowed && allow_reads) || channel->read_mangler)) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
560
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
561 if (channel->readfd >= 0) {
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
562 FD_SET(channel->readfd, readfds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
563 }
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
564
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
565 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
566 FD_SET(channel->errfd, readfds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
567 }
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
397
2908122e9eed disapproval of revision '1250b8af44b62d8f4fe0f8d9fc7e7a1cc34e7e1c'
Matt Johnston <matt@ucc.asn.au>
parents: 396
diff changeset
570 /* Stuff from the wire */
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
571 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
572 FD_SET(channel->writefd, writefds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
573 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
574
433
c216212001fc Fix for -pedantic -ansi compilation, change // to /**/, plus some signedness
Matt Johnston <matt@ucc.asn.au>
parents: 423
diff changeset
575 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
576 && 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
577 FD_SET(channel->errfd, writefds);
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
578 }
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
579
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
580 } /* foreach channel */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
581
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1192
diff changeset
582 #if DROPBEAR_LISTENERS
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
583 set_listener_fds(readfds);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
584 #endif
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 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
587
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
588 /* 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
589 * 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
590 * etc) FD is also EOF */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
591 void recv_msg_channel_eof() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
592
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
593 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
594
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
595 TRACE(("enter recv_msg_channel_eof"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
596
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
597 channel = getchannel_msg("EOF");
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
598
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
599 channel->recv_eof = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
600
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
601 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
602 TRACE(("leave recv_msg_channel_eof"))
4
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
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
606 /* 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
607 void recv_msg_channel_close() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
608
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
609 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
610
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
611 TRACE(("enter recv_msg_channel_close"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
612
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
613 channel = getchannel_msg("Close");
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
614
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
615 channel->recv_eof = 1;
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
616 channel->recv_close = 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_close"))
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 /* 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
623 * channel close */
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
624 static void remove_channel(struct Channel * channel) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
625
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
626 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
627 TRACE(("channel index is %d", channel->index))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
628
709
abd99ecd7ec2 use an empty writebuf rather than a NULL one
Matt Johnston <matt@ucc.asn.au>
parents: 707
diff changeset
629 cbuf_free(channel->writebuf);
abd99ecd7ec2 use an empty writebuf rather than a NULL one
Matt Johnston <matt@ucc.asn.au>
parents: 707
diff changeset
630 channel->writebuf = NULL;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
631
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
632 if (channel->extrabuf) {
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
633 cbuf_free(channel->extrabuf);
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
634 channel->extrabuf = NULL;
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
635 }
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
636
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
637
938
c88dce72f6d2 Make sure client exit messages don't get lost
Matt Johnston <matt@ucc.asn.au>
parents: 937
diff changeset
638 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
639 /* 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
640 * 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
641 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
642 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
643 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
644 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
645 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
646 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
647 }
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
648
1625
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
649 if (channel->type->cleanup) {
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
650 channel->type->cleanup(channel);
770
7577a3afc42d run closehandlers on cleanup
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
651 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
652
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
653 if (channel->conn_pending) {
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
654 cancel_connect(channel->conn_pending);
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
655 }
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
656
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
657 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
658 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
659 ses.chancount--;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
660
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
661 update_channel_prio();
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
662
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
663 TRACE(("leave remove_channel"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
664 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
665
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
666 /* 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
667 * such as chansession or x11fwd */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
668 void recv_msg_channel_request() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
669
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
670 struct Channel *channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
671
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
672 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
673
1038
d3925ed45a85 Fix for old compilers, variable declarations at beginning of functions
Thorsten Horstmann <thorsten.horstmann@web.de>
parents: 970
diff changeset
674 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
675
1625
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
676 if (channel->type->reqhandler) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
677 channel->type->reqhandler(channel);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
678 } 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
679 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
680 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
681 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
682 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
683 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
684 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
685 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
686
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
687 TRACE(("leave recv_msg_channel_request"))
4
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 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
690
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
691 /* 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
692 * channel_data packet to send.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
693 * 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
694 * 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
695 * exttype */
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
696 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
697
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
698 int len;
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
699 size_t maxlen, size_pos;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
700 int fd;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
701
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
702 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
703
416
a01c0c8e543a Improve behaviour when flushing out after a process has exited.
Matt Johnston <matt@ucc.asn.au>
parents: 415
diff changeset
704 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
705 dropbear_assert(!channel->sent_close);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
706
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
707 if (isextended) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
708 fd = channel->errfd;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
709 } else {
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
710 fd = channel->readfd;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
711 }
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
712 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
713 dropbear_assert(fd >= 0);
4
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 maxlen = MIN(channel->transwindow, channel->transmaxpacket);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
716 /* -(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
717 * exttype if is extended */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
718 maxlen = MIN(maxlen,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
719 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
720 TRACE(("maxlen %zd", maxlen))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
721 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
722 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
723 return;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
724 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
725
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
726 buf_putbyte(ses.writepayload,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
727 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
728 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
729 if (isextended) {
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
730 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
731 }
362
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
732 /* 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
733 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
734 buf_putint(ses.writepayload, 0);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
735
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
736 /* 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
737 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
738
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
739 if (len <= 0) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
740 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
741 /* 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
742 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
743 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
744 close_chan_fd(channel, fd, SHUT_RD);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
745 }
722
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
746 buf_setpos(ses.writepayload, 0);
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
747 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
748 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
749 len, errno, fd))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
750 return;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
751 }
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
752
722
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
753 if (channel->read_mangler) {
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
754 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
755 if (len == 0) {
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
756 buf_setpos(ses.writepayload, 0);
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
757 buf_setlen(ses.writepayload, 0);
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
758 return;
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
759 }
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
760 }
4a274f47eabd Add ~. and ~^Z handling to exit/suspend dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 709
diff changeset
761
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
762 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
763 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
764 /* ... real size here */
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
765 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
766 buf_putint(ses.writepayload, len);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
767
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
768 channel->transwindow -= len;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
769
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
770 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
771 TRACE(("leave send_msg_channel_data"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
772 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
773
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
774 /* We receive channel data */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
775 void recv_msg_channel_data() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
776
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
777 struct Channel *channel;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
778
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
779 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
780
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
781 common_recv_msg_channel_data(channel, channel->writefd, channel->writebuf);
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
782 }
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
783
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
784 /* 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
785 * for writing to the local file descriptor */
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
786 void common_recv_msg_channel_data(struct Channel *channel, int fd,
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
787 circbuffer * cbuf) {
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
788
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
789 unsigned int datalen;
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
790 unsigned int maxdata;
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
791 unsigned int buflen;
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
792 unsigned int len;
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
793 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
794 int res;
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
795
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
796 TRACE(("enter recv_msg_channel_data"))
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
797
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
798 if (channel->recv_eof) {
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 513
diff changeset
799 dropbear_exit("Received data after eof");
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
800 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
801
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
802 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
803 /* 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
804 * 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
805 * 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
806 return;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
807 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
808
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
809 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
810 TRACE(("length %d", datalen))
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
811
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
812 maxdata = cbuf_getavail(cbuf);
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
813
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
814 /* 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
815 * 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
816 * just die horribly */
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
817 if (datalen > maxdata) {
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
818 dropbear_exit("Oversized packet");
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
819 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
820
1054
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
821 dropbear_assert(channel->recvwindow >= datalen);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
822 channel->recvwindow -= datalen;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
823 dropbear_assert(channel->recvwindow <= opts.recv_window);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
824
1075
cc6116cc0b5c Avoid channel writev() when there is nothing to write
Matt Johnston <matt@ucc.asn.au>
parents: 1074
diff changeset
825 /* 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
826 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
827 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
828
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
829 datalen -= consumed;
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
830 buf_incrpos(ses.payload, consumed);
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
831
c71df09bc610 Avoid copying data into circular buffer
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
832
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
833 /* We may have to run throught twice, if the buffer wraps around. Can't
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
834 * 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
835 * 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
836 * 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
837 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
838 len = datalen;
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
839 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
840 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
841 buflen = MIN(buflen, len);
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
842
1168
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
843 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
844 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
845 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
846 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
847 len -= buflen;
509cf5df51c6 Avoid queueing into circbuffer when the channel is about to close
Matt Johnston <matt@ucc.asn.au>
parents: 1166
diff changeset
848 }
107
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
849 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
850
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
851 TRACE(("leave recv_msg_channel_data"))
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
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
854 /* 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
855 * 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
856 * 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
857 void recv_msg_channel_window_adjust() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
858
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
859 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
860 unsigned int incr;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
861
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
862 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
863
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
864 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
865 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
866 incr = MIN(incr, TRANS_MAX_WIN_INCR);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
867
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
868 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
869 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
870
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
871 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
872
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
873 /* 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
874 * end know */
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
875 static void send_msg_channel_window_adjust(const struct Channel* channel,
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
876 unsigned int incr) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
877
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
878 TRACE(("sending window adjust %d", incr))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
879 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
880
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
881 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
882 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
883 buf_putint(ses.writepayload, incr);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
884
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
885 encrypt_packet();
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
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
888 /* 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
889 void recv_msg_channel_open() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
890
1094
c45d65392c1a Fix pointer differ in signess warnings [-Werror=pointer-sign]
Gaël PORTAY <gael.portay@gmail.com>
parents: 1079
diff changeset
891 char *type;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
892 unsigned int typelen;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
893 unsigned int remotechan, transwindow, transmaxpacket;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
894 struct Channel *channel;
7
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
895 const struct ChanType **cp;
6
ab00ef513e97 Sorted out the first channel init issues.
Matt Johnston <matt@ucc.asn.au>
parents: 4
diff changeset
896 const struct ChanType *chantype;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
897 unsigned int errtype = SSH_OPEN_UNKNOWN_CHANNEL_TYPE;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
898 int ret;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
899
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
900
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
901 TRACE(("enter recv_msg_channel_open"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
902
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
903 /* get the packet contents */
1122
aaf576b27a10 Merge pull request #13 from gazoo74/fix-warnings
Matt Johnston <matt@ucc.asn.au>
parents: 1098
diff changeset
904 type = buf_getstring(ses.payload, &typelen);
4
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 remotechan = buf_getint(ses.payload);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
907 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
908 transwindow = MIN(transwindow, TRANS_MAX_WINDOW);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
909 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
910 transmaxpacket = MIN(transmaxpacket, TRANS_MAX_PAYLOAD_LEN);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
911
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
912 /* figure what type of packet it is */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
913 if (typelen > MAX_NAME_LEN) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
914 goto failure;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
915 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
916
7
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
917 /* 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
918 * 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
919 * this list and find the matching name */
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
920 for (cp = &ses.chantypes[0], chantype = (*cp);
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
921 chantype != NULL;
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
922 cp++, chantype = (*cp)) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
923 if (strcmp(type, chantype->name) == 0) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
924 break;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
925 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
926 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
927
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
928 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
929 TRACE(("No matching type for '%s'", type))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
930 goto failure;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
931 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
932
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
933 TRACE(("matched type '%s'", type))
7
425ed5c20157 Chantype handling is sorted
Matt Johnston <matt@ucc.asn.au>
parents: 6
diff changeset
934
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
935 /* create the channel */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
936 channel = newchannel(remotechan, chantype, transwindow, transmaxpacket);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
937
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
938 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
939 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
940 errtype = SSH_OPEN_RESOURCE_SHORTAGE;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
941 goto failure;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
942 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
943
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
944 if (channel->type->inithandler) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
945 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
946 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
947 /* 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
948 goto cleanup;
1c7bf9cec6c8 Rearranged some more bits, marked some areas that need work.
Matt Johnston <matt@ucc.asn.au>
parents: 359
diff changeset
949 }
6
ab00ef513e97 Sorted out the first channel init issues.
Matt Johnston <matt@ucc.asn.au>
parents: 4
diff changeset
950 if (ret > 0) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
951 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
952 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
953 TRACE(("inithandler returned failure %d", ret))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
954 goto failure;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
955 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
956 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
957
1859
1d86a58fb52d Leave non-interactive at default QoS class
Matt Johnston <matt@ucc.asn.au>
parents: 1835
diff changeset
958 update_channel_prio();
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
959
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
960 /* success */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
961 send_msg_channel_open_confirmation(channel, channel->recvwindow,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
962 channel->recvmaxpacket);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
963 goto cleanup;
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 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
966 TRACE(("recv_msg_channel_open failure"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
967 send_msg_channel_open_failure(remotechan, errtype, "", "");
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
968
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
969 cleanup:
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
970 m_free(type);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
971
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(("leave recv_msg_channel_open"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
973 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
974
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
975 /* Send a failure message */
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
976 void send_msg_channel_failure(const struct Channel *channel) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
977
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
978 TRACE(("enter send_msg_channel_failure"))
1625
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
979
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
980 if (channel->sent_close) {
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
981 TRACE(("Skipping sending msg_channel_failure for closed channel"))
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
982 return;
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
983 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
984 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
985
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
986 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_FAILURE);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
987 buf_putint(ses.writepayload, channel->remotechan);
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 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
990 TRACE(("leave send_msg_channel_failure"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
991 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
992
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
993 /* Send a success message */
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
994 void send_msg_channel_success(const struct Channel *channel) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
995
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
996 TRACE(("enter send_msg_channel_success"))
1625
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
997 if (channel->sent_close) {
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
998 TRACE(("Skipping sending msg_channel_success for closed channel"))
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
999 return;
79eef94ccea9 Split ChanType closehandler() and cleanup() so that dbclient doesn't
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
1000 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1001 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1002
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1003 buf_putbyte(ses.writepayload, SSH_MSG_CHANNEL_SUCCESS);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1004 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1005
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1006 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
1007 TRACE(("leave send_msg_channel_success"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1008 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1009
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1010 /* 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
1011 * code (usually resource shortage or unknown chan type) */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1012 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
1013 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
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_open_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_OPEN_FAILURE);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1019 buf_putint(ses.writepayload, remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1020 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
1021 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
1022 buf_putstring(ses.writepayload, lang, strlen(lang));
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 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
1025 TRACE(("leave send_msg_channel_open_failure"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1026 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1027
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1028 /* 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
1029 * allocated and the receive parameters */
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
1030 static void send_msg_channel_open_confirmation(const struct Channel* channel,
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1031 unsigned int recvwindow,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1032 unsigned int recvmaxpacket) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1033
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
1034 TRACE(("enter send_msg_channel_open_confirmation"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1035 CHECKCLEARTOWRITE();
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 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
1038 buf_putint(ses.writepayload, channel->remotechan);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1039 buf_putint(ses.writepayload, channel->index);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1040 buf_putint(ses.writepayload, recvwindow);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1041 buf_putint(ses.writepayload, recvmaxpacket);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1042
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1043 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
1044 TRACE(("leave send_msg_channel_open_confirmation"))
4
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
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1047 /* 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
1048 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
1049
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1050 int closein = 0, closeout = 0;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1051
1829
a7cc3332d8ab Replace ChanType.sepfds with Channel.bidir_fd
Matt Johnston <matt@ucc.asn.au>
parents: 1828
diff changeset
1052 if (channel->bidir_fd) {
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1053 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
1054 shutdown(fd, how);
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1055 if (how == 0) {
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1056 closeout = 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1057 } else {
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1058 closein = 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1059 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1060 } else {
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1061 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
1062 m_close(fd);
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1063 closein = closeout = 1;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1064 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1065
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1066 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
1067 channel->readfd = FD_CLOSED;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1068 }
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1069 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
1070 channel->errfd = FD_CLOSED;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1071 }
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1072
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1073 if (closein && fd == channel->writefd) {
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1074 channel->writefd = FD_CLOSED;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1075 }
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1076 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
1077 channel->errfd = FD_CLOSED;
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1078 }
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 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
1081 * need to close() it to stop it lingering */
1829
a7cc3332d8ab Replace ChanType.sepfds with Channel.bidir_fd
Matt Johnston <matt@ucc.asn.au>
parents: 1828
diff changeset
1082 if (channel->bidir_fd && channel->readfd == FD_CLOSED
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1083 && channel->writefd == FD_CLOSED && channel->errfd == FD_CLOSED) {
375
8d149b812669 - Add some extra tracing.
Matt Johnston <matt@ucc.asn.au>
parents: 365
diff changeset
1084 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
1085 m_close(fd);
363
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1086 }
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
6ba2894ec8d5 Rearranged (and hopefully simplified) channel close/eof handling
Matt Johnston <matt@ucc.asn.au>
parents: 362
diff changeset
1089
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1192
diff changeset
1090 #if (DROPBEAR_LISTENERS) || (DROPBEAR_CLIENT)
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1091 /* 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
1092 * 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
1093 * 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
1094 * 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
1095 * 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
1096 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
1097
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1098 struct Channel* chan;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1099
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
1100 TRACE(("enter send_msg_channel_open_init()"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1101 chan = newchannel(0, type, 0, 0);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1102 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
1103 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
1104 return DROPBEAR_FAILURE;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1105 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1106
707
564e7f87ecc3 Fix memory leak when direct TCP connections time out on connection.
Matt Johnston <matt@ucc.asn.au>
parents: 673
diff changeset
1107 /* 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
1108 * 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
1109
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1110 /* set fd non-blocking */
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
1111 setnonblocking(fd);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1112
253
84925eceeb13 * rename infd/outfd to writefd/readfd, to avoid confusion
Matt Johnston <matt@ucc.asn.au>
parents: 243
diff changeset
1113 chan->writefd = chan->readfd = fd;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1114 ses.maxfd = MAX(ses.maxfd, fd);
1829
a7cc3332d8ab Replace ChanType.sepfds with Channel.bidir_fd
Matt Johnston <matt@ucc.asn.au>
parents: 1828
diff changeset
1115 chan->bidir_fd = 1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1116
243
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1117 chan->await_open = 1;
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1118
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1119 /* now open the channel connection */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1120 CHECKCLEARTOWRITE();
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1121
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1122 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
1123 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
1124 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
1125 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
1126 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
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(("leave send_msg_channel_open_init()"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1129 return DROPBEAR_SUCCESS;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1130 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1131
1827
8a78cc13eb30 Fix some outdated comments
Matt Johnston <matt@ucc.asn.au>
parents: 1800
diff changeset
1132 /* Confirmation that our channel open request was
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1133 * successful*/
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1134 void recv_msg_channel_open_confirmation() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1135
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1136 struct Channel * channel;
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1137 int ret;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1138
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
1139 TRACE(("enter recv_msg_channel_open_confirmation"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1140
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
1141 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1142
243
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1143 if (!channel->await_open) {
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 513
diff changeset
1144 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
1145 }
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1146 channel->await_open = 0;
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1147
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1148 channel->remotechan = buf_getint(ses.payload);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1149 channel->transwindow = buf_getint(ses.payload);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1150 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
1151
187
c44df7123b0a compile fix when TRACE debugging is enabled
Matt Johnston <matt@ucc.asn.au>
parents: 179
diff changeset
1152 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
1153 channel->remotechan, channel->index))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1154
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1155 /* Run the inithandler callback */
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1156 if (channel->type->inithandler) {
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1157 ret = channel->type->inithandler(channel);
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1158 if (ret > 0) {
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
1159 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
1160 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
1161 return;
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1162 }
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1163 }
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
1164
941
5daedffd0769 Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents: 938
diff changeset
1165 update_channel_prio();
1859
1d86a58fb52d Leave non-interactive at default QoS class
Matt Johnston <matt@ucc.asn.au>
parents: 1835
diff changeset
1166
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
1167 TRACE(("leave recv_msg_channel_open_confirmation"))
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1168 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1169
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1170 /* Notification that our channel open request failed */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1171 void recv_msg_channel_open_failure() {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1172
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1173 struct Channel * channel;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1174
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
1175 channel = getchannel();
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1176
243
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1177 if (!channel->await_open) {
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 513
diff changeset
1178 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
1179 }
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1180 channel->await_open = 0;
0056419cf0f4 * ensure that we only handle open confirmation/failure
Matt Johnston <matt@ucc.asn.au>
parents: 241
diff changeset
1181
359
78518751cb82 just shuffle some variables names about, a brief comment
Matt Johnston <matt@ucc.asn.au>
parents: 332
diff changeset
1182 remove_channel(channel);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1183 }
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1192
diff changeset
1184 #endif /* DROPBEAR_LISTENERS */
937
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1185
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1186 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
1187 CHECKCLEARTOWRITE();
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1188 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
1189 encrypt_packet();
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1190 }
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1191
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1192 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
1193 CHECKCLEARTOWRITE();
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1194 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
1195 encrypt_packet();
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
1196 }
970
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1197
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1198 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
1199 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
1200 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
1201 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
1202 }
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1203 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
1204 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
1205 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
1206 && !(chan->sent_eof || chan->recv_eof)
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
1207 && !(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
1208 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
1209 }
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1210 }
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1211 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
1212 }
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1213
1459
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
1214 void start_send_channel_request(const struct Channel *channel,
06d52bcb8094 Pointer parameter could be declared as pointing to const
Francois Perrad <francois.perrad@gadz.org>
parents: 1325
diff changeset
1215 const 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
1216
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1217 CHECKCLEARTOWRITE();
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1218 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
1219 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
1220
1122
aaf576b27a10 Merge pull request #13 from gazoo74/fix-warnings
Matt Johnston <matt@ucc.asn.au>
parents: 1098
diff changeset
1221 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
1222
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 955
diff changeset
1223 }