When iterating over all channels for a dead SSH connection, don't miss out
authorjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Mon, 3 Jan 2011 16:50:41 +0000 (16:50 +0000)
committerjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Mon, 3 Jan 2011 16:50:41 +0000 (16:50 +0000)
those in the CHAN_SOCKDATA_DORMANT state (i.e., local-to-remote forwardings
which the SSH server had not yet acknowledged).
Marcel Kilgus has been running with the ssh_do_close() patch for nearly two
years (*cough*) and reports that it has eliminated frequent
'unclean-close-crash' symptoms for him (due to the unclosed socket generating
a pfd_closing() which accessed freed memory), although I've not reproduced
that. The patch to ssh_free() is mine and not known to fix any symptoms.

git-svn-id: svn://svn.tartarus.org/sgt/putty@9069 cda61777-01e9-0310-a592-d414129be87e

ssh.c

diff --git a/ssh.c b/ssh.c
index 0a485da..a7f1c6b 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -2862,6 +2862,7 @@ static int ssh_do_close(Ssh ssh, int notify_exit)
                x11_close(c->u.x11.s);
                break;
              case CHAN_SOCKDATA:
+             case CHAN_SOCKDATA_DORMANT:
                pfd_close(c->u.pfd.s);
                break;
            }
@@ -9357,6 +9358,7 @@ static void ssh_free(void *handle)
                    x11_close(c->u.x11.s);
                break;
              case CHAN_SOCKDATA:
+             case CHAN_SOCKDATA_DORMANT:
                if (c->u.pfd.s != NULL)
                    pfd_close(c->u.pfd.s);
                break;