]> andersk Git - openssh.git/commitdiff
- markus@cvs.openbsd.org 2004/01/19 09:24:21
authordjm <djm>
Wed, 21 Jan 2004 00:02:09 +0000 (00:02 +0000)
committerdjm <djm>
Wed, 21 Jan 2004 00:02:09 +0000 (00:02 +0000)
     [channels.c]
     fake consumption for half closed channels since the peer is waiting for
     window adjust messages; bugzilla #790 Matthew Dillon; test + ok dtucker@
     reproduce with sh -c 'ulimit -f 10; ssh host -n od /bsd | cat > foo'

ChangeLog
channels.c

index 0e033f6042721cbfae11744dc27ea6e0164151fa..0218210af57420244444278e38ed5ce44e80b0bf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
    - markus@cvs.openbsd.org 2004/01/13 19:45:15
      [compress.c]
      cast for portability; millert@
+   - markus@cvs.openbsd.org 2004/01/19 09:24:21
+     [channels.c]
+     fake consumption for half closed channels since the peer is waiting for
+     window adjust messages; bugzilla #790 Matthew Dillon; test + ok dtucker@
+     reproduce with sh -c 'ulimit -f 10; ssh host -n od /bsd | cat > foo'
 
 20040114
  - (dtucker) [auth-pam.c] Have monitor die if PAM authentication thread exits
index 14405bd4b33f13695946ee253eb147d5178b351d..e663c21596c2065a2cd6cec5810f8df5c00264c7 100644 (file)
@@ -39,7 +39,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: channels.c,v 1.199 2003/12/02 17:01:14 markus Exp $");
+RCSID("$OpenBSD: channels.c,v 1.200 2004/01/19 09:24:21 markus Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -1817,13 +1817,25 @@ channel_input_data(int type, u_int32_t seq, void *ctxt)
            c->type != SSH_CHANNEL_X11_OPEN)
                return;
 
-       /* same for protocol 1.5 if output end is no longer open */
-       if (!compat13 && c->ostate != CHAN_OUTPUT_OPEN)
-               return;
-
        /* Get the data. */
        data = packet_get_string(&data_len);
 
+       /*
+        * Ignore data for protocol > 1.3 if output end is no longer open.
+        * For protocol 2 the sending side is reducing its window as it sends
+        * data, so we must 'fake' consumption of the data in order to ensure
+        * that window updates are sent back.  Otherwise the connection might
+        * deadlock.
+        */
+       if (!compat13 && c->ostate != CHAN_OUTPUT_OPEN) {
+               if (compat20) {
+                       c->local_window -= data_len;
+                       c->local_consumed += data_len;
+               }
+               xfree(data);
+               return;
+       }
+
        if (compat20) {
                if (data_len > c->local_maxpacket) {
                        logit("channel %d: rcvd big packet %d, maxpack %d",
This page took 0.048089 seconds and 5 git commands to generate.