OpenCoverage

nchan.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssh/src/nchan.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: nchan.c,v 1.67 2017/09/12 06:35:32 djm Exp $ */-
2/*-
3 * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved.-
4 *-
5 * Redistribution and use in source and binary forms, with or without-
6 * modification, are permitted provided that the following conditions-
7 * are met:-
8 * 1. Redistributions of source code must retain the above copyright-
9 * notice, this list of conditions and the following disclaimer.-
10 * 2. Redistributions in binary form must reproduce the above copyright-
11 * notice, this list of conditions and the following disclaimer in the-
12 * documentation and/or other materials provided with the distribution.-
13 *-
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR-
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES-
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.-
17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,-
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT-
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,-
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY-
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT-
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF-
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.-
24 */-
25-
26#include "includes.h"-
27-
28#include <sys/types.h>-
29#include <sys/socket.h>-
30-
31#include <errno.h>-
32#include <string.h>-
33#include <stdarg.h>-
34-
35#include "openbsd-compat/sys-queue.h"-
36#include "ssh2.h"-
37#include "sshbuf.h"-
38#include "ssherr.h"-
39#include "packet.h"-
40#include "channels.h"-
41#include "compat.h"-
42#include "log.h"-
43-
44/*-
45 * SSH Protocol 1.5 aka New Channel Protocol-
46 * Thanks to Martina, Axel and everyone who left Erlangen, leaving me bored.-
47 * Written by Markus Friedl in October 1999-
48 *-
49 * Protocol versions 1.3 and 1.5 differ in the handshake protocol used for the-
50 * tear down of channels:-
51 *-
52 * 1.3: strict request-ack-protocol:-
53 * CLOSE ->-
54 * <- CLOSE_CONFIRM-
55 *-
56 * 1.5: uses variations of:-
57 * IEOF ->-
58 * <- OCLOSE-
59 * <- IEOF-
60 * OCLOSE ->-
61 * i.e. both sides have to close the channel-
62 *-
63 * 2.0: the EOF messages are optional-
64 *-
65 * See the debugging output from 'ssh -v' and 'sshd -d' of-
66 * ssh-1.2.27 as an example.-
67 *-
68 */-
69-
70/* functions manipulating channel states */-
71/*-
72 * EVENTS update channel input/output states execute ACTIONS-
73 */-
74/*-
75 * ACTIONS: should never update the channel states-
76 */-
77static void chan_send_eof2(struct ssh *, Channel *);-
78static void chan_send_eow2(struct ssh *, Channel *);-
79-
80/* helper */-
81static void chan_shutdown_write(struct ssh *, Channel *);-
82static void chan_shutdown_read(struct ssh *, Channel *);-
83-
84static const char *ostates[] = { "open", "drain", "wait_ieof", "closed" };-
85static const char *istates[] = { "open", "drain", "wait_oclose", "closed" };-
86-
87static void-
88chan_set_istate(Channel *c, u_int next)-
89{-
90 if (c->istate > CHAN_INPUT_CLOSED || next > CHAN_INPUT_CLOSED)
c->istate > 3Description
TRUEnever evaluated
FALSEnever evaluated
next > 3Description
TRUEnever evaluated
FALSEnever evaluated
0
91 fatal("chan_set_istate: bad state %d -> %d", c->istate, next);
never executed: fatal("chan_set_istate: bad state %d -> %d", c->istate, next);
0
92 debug2("channel %d: input %s -> %s", c->self, istates[c->istate],-
93 istates[next]);-
94 c->istate = next;-
95}
never executed: end of block
0
96-
97static void-
98chan_set_ostate(Channel *c, u_int next)-
99{-
100 if (c->ostate > CHAN_OUTPUT_CLOSED || next > CHAN_OUTPUT_CLOSED)
c->ostate > 3Description
TRUEnever evaluated
FALSEnever evaluated
next > 3Description
TRUEnever evaluated
FALSEnever evaluated
0
101 fatal("chan_set_ostate: bad state %d -> %d", c->ostate, next);
never executed: fatal("chan_set_ostate: bad state %d -> %d", c->ostate, next);
0
102 debug2("channel %d: output %s -> %s", c->self, ostates[c->ostate],-
103 ostates[next]);-
104 c->ostate = next;-
105}
never executed: end of block
0
106-
107void-
108chan_read_failed(struct ssh *ssh, Channel *c)-
109{-
110 debug2("channel %d: read failed", c->self);-
111 switch (c->istate) {-
112 case CHAN_INPUT_OPEN:
never executed: case 0:
0
113 chan_shutdown_read(ssh, c);-
114 chan_set_istate(c, CHAN_INPUT_WAIT_DRAIN);-
115 break;
never executed: break;
0
116 default:
never executed: default:
0
117 error("channel %d: chan_read_failed for istate %d",-
118 c->self, c->istate);-
119 break;
never executed: break;
0
120 }-
121}-
122-
123void-
124chan_ibuf_empty(struct ssh *ssh, Channel *c)-
125{-
126 debug2("channel %d: ibuf empty", c->self);-
127 if (sshbuf_len(c->input)) {
sshbuf_len(c->input)Description
TRUEnever evaluated
FALSEnever evaluated
0
128 error("channel %d: chan_ibuf_empty for non empty buffer",-
129 c->self);-
130 return;
never executed: return;
0
131 }-
132 switch (c->istate) {-
133 case CHAN_INPUT_WAIT_DRAIN:
never executed: case 1:
0
134 if (!(c->flags & (CHAN_CLOSE_SENT|CHAN_LOCAL)))
!(c->flags & (0x01|0x10))Description
TRUEnever evaluated
FALSEnever evaluated
0
135 chan_send_eof2(ssh, c);
never executed: chan_send_eof2(ssh, c);
0
136 chan_set_istate(c, CHAN_INPUT_CLOSED);-
137 break;
never executed: break;
0
138 default:
never executed: default:
0
139 error("channel %d: chan_ibuf_empty for istate %d",-
140 c->self, c->istate);-
141 break;
never executed: break;
0
142 }-
143}-
144-
145void-
146chan_obuf_empty(struct ssh *ssh, Channel *c)-
147{-
148 debug2("channel %d: obuf empty", c->self);-
149 if (sshbuf_len(c->output)) {
sshbuf_len(c->output)Description
TRUEnever evaluated
FALSEnever evaluated
0
150 error("channel %d: chan_obuf_empty for non empty buffer",-
151 c->self);-
152 return;
never executed: return;
0
153 }-
154 switch (c->ostate) {-
155 case CHAN_OUTPUT_WAIT_DRAIN:
never executed: case 1:
0
156 chan_shutdown_write(ssh, c);-
157 chan_set_ostate(c, CHAN_OUTPUT_CLOSED);-
158 break;
never executed: break;
0
159 default:
never executed: default:
0
160 error("channel %d: internal error: obuf_empty for ostate %d",-
161 c->self, c->ostate);-
162 break;
never executed: break;
0
163 }-
164}-
165-
166void-
167chan_rcvd_eow(struct ssh *ssh, Channel *c)-
168{-
169 debug2("channel %d: rcvd eow", c->self);-
170 switch (c->istate) {-
171 case CHAN_INPUT_OPEN:
never executed: case 0:
0
172 chan_shutdown_read(ssh, c);-
173 chan_set_istate(c, CHAN_INPUT_CLOSED);-
174 break;
never executed: break;
0
175 }-
176}
never executed: end of block
0
177-
178static void-
179chan_send_eof2(struct ssh *ssh, Channel *c)-
180{-
181 int r;-
182-
183 debug2("channel %d: send eof", c->self);-
184 switch (c->istate) {-
185 case CHAN_INPUT_WAIT_DRAIN:
never executed: case 1:
0
186 if (!c->have_remote_id)
!c->have_remote_idDescription
TRUEnever evaluated
FALSEnever evaluated
0
187 fatal("%s: channel %d: no remote_id",
never executed: fatal("%s: channel %d: no remote_id", __func__, c->self);
0
188 __func__, c->self);
never executed: fatal("%s: channel %d: no remote_id", __func__, c->self);
0
189 if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_EOF)) != 0 ||
(r = sshpkt_st...ssh, 96)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
190 (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
(r = sshpkt_pu...mote_id)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
191 (r = sshpkt_send(ssh)) != 0)
(r = sshpkt_send(ssh)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
192 fatal("%s: send CHANNEL_EOF: %s", __func__, ssh_err(r));
never executed: fatal("%s: send CHANNEL_EOF: %s", __func__, ssh_err(r));
0
193 c->flags |= CHAN_EOF_SENT;-
194 break;
never executed: break;
0
195 default:
never executed: default:
0
196 error("channel %d: cannot send eof for istate %d",-
197 c->self, c->istate);-
198 break;
never executed: break;
0
199 }-
200}-
201-
202static void-
203chan_send_close2(struct ssh *ssh, Channel *c)-
204{-
205 int r;-
206-
207 debug2("channel %d: send close", c->self);-
208 if (c->ostate != CHAN_OUTPUT_CLOSED ||
c->ostate != 3Description
TRUEnever evaluated
FALSEnever evaluated
0
209 c->istate != CHAN_INPUT_CLOSED) {
c->istate != 3Description
TRUEnever evaluated
FALSEnever evaluated
0
210 error("channel %d: cannot send close for istate/ostate %d/%d",-
211 c->self, c->istate, c->ostate);-
212 } else if (c->flags & CHAN_CLOSE_SENT) {
never executed: end of block
c->flags & 0x01Description
TRUEnever evaluated
FALSEnever evaluated
0
213 error("channel %d: already sent close", c->self);-
214 } else {
never executed: end of block
0
215 if (!c->have_remote_id)
!c->have_remote_idDescription
TRUEnever evaluated
FALSEnever evaluated
0
216 fatal("%s: channel %d: no remote_id",
never executed: fatal("%s: channel %d: no remote_id", __func__, c->self);
0
217 __func__, c->self);
never executed: fatal("%s: channel %d: no remote_id", __func__, c->self);
0
218 if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_CLOSE)) != 0 ||
(r = sshpkt_st...ssh, 97)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
219 (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
(r = sshpkt_pu...mote_id)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
220 (r = sshpkt_send(ssh)) != 0)
(r = sshpkt_send(ssh)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
221 fatal("%s: send CHANNEL_EOF: %s", __func__, ssh_err(r));
never executed: fatal("%s: send CHANNEL_EOF: %s", __func__, ssh_err(r));
0
222 c->flags |= CHAN_CLOSE_SENT;-
223 }
never executed: end of block
0
224}-
225-
226static void-
227chan_send_eow2(struct ssh *ssh, Channel *c)-
228{-
229 int r;-
230-
231 debug2("channel %d: send eow", c->self);-
232 if (c->ostate == CHAN_OUTPUT_CLOSED) {
c->ostate == 3Description
TRUEnever evaluated
FALSEnever evaluated
0
233 error("channel %d: must not sent eow on closed output",-
234 c->self);-
235 return;
never executed: return;
0
236 }-
237 if (!(datafellows & SSH_NEW_OPENSSH))
!(datafellows & 0x04000000)Description
TRUEnever evaluated
FALSEnever evaluated
0
238 return;
never executed: return;
0
239 if (!c->have_remote_id)
!c->have_remote_idDescription
TRUEnever evaluated
FALSEnever evaluated
0
240 fatal("%s: channel %d: no remote_id", __func__, c->self);
never executed: fatal("%s: channel %d: no remote_id", __func__, c->self);
0
241 if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_REQUEST)) != 0 ||
(r = sshpkt_st...ssh, 98)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
242 (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
(r = sshpkt_pu...mote_id)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
243 (r = sshpkt_put_cstring(ssh, "eow@openssh.com")) != 0 ||
(r = sshpkt_pu...sh.com")) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
244 (r = sshpkt_put_u8(ssh, 0)) != 0 ||
(r = sshpkt_pu...(ssh, 0)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
245 (r = sshpkt_send(ssh)) != 0)
(r = sshpkt_send(ssh)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
246 fatal("%s: send CHANNEL_EOF: %s", __func__, ssh_err(r));
never executed: fatal("%s: send CHANNEL_EOF: %s", __func__, ssh_err(r));
0
247}
never executed: end of block
0
248-
249/* shared */-
250-
251void-
252chan_rcvd_ieof(struct ssh *ssh, Channel *c)-
253{-
254 debug2("channel %d: rcvd eof", c->self);-
255 c->flags |= CHAN_EOF_RCVD;-
256 if (c->ostate == CHAN_OUTPUT_OPEN)
c->ostate == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
257 chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);
never executed: chan_set_ostate(c, 1);
0
258 if (c->ostate == CHAN_OUTPUT_WAIT_DRAIN &&
c->ostate == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
259 sshbuf_len(c->output) == 0 &&
sshbuf_len(c->output) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
260 !CHANNEL_EFD_OUTPUT_ACTIVE(c))
c->extended_usage == 2Description
TRUEnever evaluated
FALSEnever evaluated
c->efd != -1Description
TRUEnever evaluated
FALSEnever evaluated
!(c->flags & (0x08|0x02))Description
TRUEnever evaluated
FALSEnever evaluated
sshbuf_len(c->extended) > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
261 chan_obuf_empty(ssh, c);
never executed: chan_obuf_empty(ssh, c);
0
262}
never executed: end of block
0
263-
264void-
265chan_rcvd_oclose(struct ssh *ssh, Channel *c)-
266{-
267 debug2("channel %d: rcvd close", c->self);-
268 if (!(c->flags & CHAN_LOCAL)) {
!(c->flags & 0x10)Description
TRUEnever evaluated
FALSEnever evaluated
0
269 if (c->flags & CHAN_CLOSE_RCVD)
c->flags & 0x02Description
TRUEnever evaluated
FALSEnever evaluated
0
270 error("channel %d: protocol error: close rcvd twice",
never executed: error("channel %d: protocol error: close rcvd twice", c->self);
0
271 c->self);
never executed: error("channel %d: protocol error: close rcvd twice", c->self);
0
272 c->flags |= CHAN_CLOSE_RCVD;-
273 }
never executed: end of block
0
274 if (c->type == SSH_CHANNEL_LARVAL) {
c->type == 10Description
TRUEnever evaluated
FALSEnever evaluated
0
275 /* tear down larval channels immediately */-
276 chan_set_ostate(c, CHAN_OUTPUT_CLOSED);-
277 chan_set_istate(c, CHAN_INPUT_CLOSED);-
278 return;
never executed: return;
0
279 }-
280 switch (c->ostate) {-
281 case CHAN_OUTPUT_OPEN:
never executed: case 0:
0
282 /*-
283 * wait until a data from the channel is consumed if a CLOSE-
284 * is received-
285 */-
286 chan_set_ostate(c, CHAN_OUTPUT_WAIT_DRAIN);-
287 break;
never executed: break;
0
288 }-
289 switch (c->istate) {-
290 case CHAN_INPUT_OPEN:
never executed: case 0:
0
291 chan_shutdown_read(ssh, c);-
292 chan_set_istate(c, CHAN_INPUT_CLOSED);-
293 break;
never executed: break;
0
294 case CHAN_INPUT_WAIT_DRAIN:
never executed: case 1:
0
295 if (!(c->flags & CHAN_LOCAL))
!(c->flags & 0x10)Description
TRUEnever evaluated
FALSEnever evaluated
0
296 chan_send_eof2(ssh, c);
never executed: chan_send_eof2(ssh, c);
0
297 chan_set_istate(c, CHAN_INPUT_CLOSED);-
298 break;
never executed: break;
0
299 }-
300}
never executed: end of block
0
301-
302void-
303chan_write_failed(struct ssh *ssh, Channel *c)-
304{-
305 debug2("channel %d: write failed", c->self);-
306 switch (c->ostate) {-
307 case CHAN_OUTPUT_OPEN:
never executed: case 0:
0
308 case CHAN_OUTPUT_WAIT_DRAIN:
never executed: case 1:
0
309 chan_shutdown_write(ssh, c);-
310 if (strcmp(c->ctype, "session") == 0)
never executed: __result = (((const unsigned char *) (const char *) ( c->ctype ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "session" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
311 chan_send_eow2(ssh, c);
never executed: chan_send_eow2(ssh, c);
0
312 chan_set_ostate(c, CHAN_OUTPUT_CLOSED);-
313 break;
never executed: break;
0
314 default:
never executed: default:
0
315 error("channel %d: chan_write_failed for ostate %d",-
316 c->self, c->ostate);-
317 break;
never executed: break;
0
318 }-
319}-
320-
321void-
322chan_mark_dead(struct ssh *ssh, Channel *c)-
323{-
324 c->type = SSH_CHANNEL_ZOMBIE;-
325}
never executed: end of block
0
326-
327int-
328chan_is_dead(struct ssh *ssh, Channel *c, int do_send)-
329{-
330 if (c->type == SSH_CHANNEL_ZOMBIE) {
c->type == 14Description
TRUEnever evaluated
FALSEnever evaluated
0
331 debug2("channel %d: zombie", c->self);-
332 return 1;
never executed: return 1;
0
333 }-
334 if (c->istate != CHAN_INPUT_CLOSED || c->ostate != CHAN_OUTPUT_CLOSED)
c->istate != 3Description
TRUEnever evaluated
FALSEnever evaluated
c->ostate != 3Description
TRUEnever evaluated
FALSEnever evaluated
0
335 return 0;
never executed: return 0;
0
336 if ((datafellows & SSH_BUG_EXTEOF) &&
(datafellows & 0x00200000)Description
TRUEnever evaluated
FALSEnever evaluated
0
337 c->extended_usage == CHAN_EXTENDED_WRITE &&
c->extended_usage == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
338 c->efd != -1 &&
c->efd != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
339 sshbuf_len(c->extended) > 0) {
sshbuf_len(c->extended) > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
340 debug2("channel %d: active efd: %d len %zu",-
341 c->self, c->efd, sshbuf_len(c->extended));-
342 return 0;
never executed: return 0;
0
343 }-
344 if (c->flags & CHAN_LOCAL) {
c->flags & 0x10Description
TRUEnever evaluated
FALSEnever evaluated
0
345 debug2("channel %d: is dead (local)", c->self);-
346 return 1;
never executed: return 1;
0
347 } -
348 if (!(c->flags & CHAN_CLOSE_SENT)) {
!(c->flags & 0x01)Description
TRUEnever evaluated
FALSEnever evaluated
0
349 if (do_send) {
do_sendDescription
TRUEnever evaluated
FALSEnever evaluated
0
350 chan_send_close2(ssh, c);-
351 } else {
never executed: end of block
0
352 /* channel would be dead if we sent a close */-
353 if (c->flags & CHAN_CLOSE_RCVD) {
c->flags & 0x02Description
TRUEnever evaluated
FALSEnever evaluated
0
354 debug2("channel %d: almost dead",-
355 c->self);-
356 return 1;
never executed: return 1;
0
357 }-
358 }
never executed: end of block
0
359 }-
360 if ((c->flags & CHAN_CLOSE_SENT) &&
(c->flags & 0x01)Description
TRUEnever evaluated
FALSEnever evaluated
0
361 (c->flags & CHAN_CLOSE_RCVD)) {
(c->flags & 0x02)Description
TRUEnever evaluated
FALSEnever evaluated
0
362 debug2("channel %d: is dead", c->self);-
363 return 1;
never executed: return 1;
0
364 }-
365 return 0;
never executed: return 0;
0
366}-
367-
368/* helper */-
369static void-
370chan_shutdown_write(struct ssh *ssh, Channel *c)-
371{-
372 sshbuf_reset(c->output);-
373 if (c->type == SSH_CHANNEL_LARVAL)
c->type == 10Description
TRUEnever evaluated
FALSEnever evaluated
0
374 return;
never executed: return;
0
375 /* shutdown failure is allowed if write failed already */-
376 debug2("channel %d: close_write", c->self);-
377 if (c->sock != -1) {
c->sock != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
378 if (shutdown(c->sock, SHUT_WR) < 0)
shutdown(c->so... SHUT_WR ) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
379 debug2("channel %d: chan_shutdown_write: "
never executed: debug2("channel %d: chan_shutdown_write: " "shutdown() failed for fd %d: %.100s", c->self, c->sock, strerror( (*__errno_location ()) ));
0
380 "shutdown() failed for fd %d: %.100s",
never executed: debug2("channel %d: chan_shutdown_write: " "shutdown() failed for fd %d: %.100s", c->self, c->sock, strerror( (*__errno_location ()) ));
0
381 c->self, c->sock, strerror(errno));
never executed: debug2("channel %d: chan_shutdown_write: " "shutdown() failed for fd %d: %.100s", c->self, c->sock, strerror( (*__errno_location ()) ));
0
382 } else {
never executed: end of block
0
383 if (channel_close_fd(ssh, &c->wfd) < 0)
channel_close_..., &c->wfd) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
384 logit("channel %d: chan_shutdown_write: "
never executed: logit("channel %d: chan_shutdown_write: " "close() failed for fd %d: %.100s", c->self, c->wfd, strerror( (*__errno_location ()) ));
0
385 "close() failed for fd %d: %.100s",
never executed: logit("channel %d: chan_shutdown_write: " "close() failed for fd %d: %.100s", c->self, c->wfd, strerror( (*__errno_location ()) ));
0
386 c->self, c->wfd, strerror(errno));
never executed: logit("channel %d: chan_shutdown_write: " "close() failed for fd %d: %.100s", c->self, c->wfd, strerror( (*__errno_location ()) ));
0
387 }
never executed: end of block
0
388}-
389-
390static void-
391chan_shutdown_read(struct ssh *ssh, Channel *c)-
392{-
393 if (c->type == SSH_CHANNEL_LARVAL)
c->type == 10Description
TRUEnever evaluated
FALSEnever evaluated
0
394 return;
never executed: return;
0
395 debug2("channel %d: close_read", c->self);-
396 if (c->sock != -1) {
c->sock != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
397 /*-
398 * shutdown(sock, SHUT_READ) may return ENOTCONN if the-
399 * write side has been closed already. (bug on Linux)-
400 * HP-UX may return ENOTCONN also.-
401 */-
402 if (shutdown(c->sock, SHUT_RD) < 0
shutdown(c->so... SHUT_RD ) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
403 && errno != ENOTCONN)
(*__errno_location ()) != 107Description
TRUEnever evaluated
FALSEnever evaluated
0
404 error("channel %d: chan_shutdown_read: "
never executed: error("channel %d: chan_shutdown_read: " "shutdown() failed for fd %d [i%d o%d]: %.100s", c->self, c->sock, c->istate, c->ostate, strerror( (*__errno_location ()) ));
0
405 "shutdown() failed for fd %d [i%d o%d]: %.100s",
never executed: error("channel %d: chan_shutdown_read: " "shutdown() failed for fd %d [i%d o%d]: %.100s", c->self, c->sock, c->istate, c->ostate, strerror( (*__errno_location ()) ));
0
406 c->self, c->sock, c->istate, c->ostate,
never executed: error("channel %d: chan_shutdown_read: " "shutdown() failed for fd %d [i%d o%d]: %.100s", c->self, c->sock, c->istate, c->ostate, strerror( (*__errno_location ()) ));
0
407 strerror(errno));
never executed: error("channel %d: chan_shutdown_read: " "shutdown() failed for fd %d [i%d o%d]: %.100s", c->self, c->sock, c->istate, c->ostate, strerror( (*__errno_location ()) ));
0
408 } else {
never executed: end of block
0
409 if (channel_close_fd(ssh, &c->rfd) < 0)
channel_close_..., &c->rfd) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
410 logit("channel %d: chan_shutdown_read: "
never executed: logit("channel %d: chan_shutdown_read: " "close() failed for fd %d: %.100s", c->self, c->rfd, strerror( (*__errno_location ()) ));
0
411 "close() failed for fd %d: %.100s",
never executed: logit("channel %d: chan_shutdown_read: " "close() failed for fd %d: %.100s", c->self, c->rfd, strerror( (*__errno_location ()) ));
0
412 c->self, c->rfd, strerror(errno));
never executed: logit("channel %d: chan_shutdown_read: " "close() failed for fd %d: %.100s", c->self, c->rfd, strerror( (*__errno_location ()) ));
0
413 }
never executed: end of block
0
414}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2