Redo a mis-fix of a memory leak in r9919: I added sfree(data)
[sgt/putty] / ssh.c
diff --git a/ssh.c b/ssh.c
index db31d38..16ef056 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -5909,6 +5909,16 @@ static void do_ssh2_transport(Ssh ssh, void *vin, int inlen,
        ssh_pkt_getstring(pktin, &str, &len);  /* server->client language */
        s->ignorepkt = ssh2_pkt_getbool(pktin) && !s->guessok;
 
+       ssh->exhash = ssh->kex->hash->init();
+       hash_string(ssh->kex->hash, ssh->exhash, ssh->v_c, strlen(ssh->v_c));
+       hash_string(ssh->kex->hash, ssh->exhash, ssh->v_s, strlen(ssh->v_s));
+       hash_string(ssh->kex->hash, ssh->exhash,
+           s->our_kexinit, s->our_kexinitlen);
+       sfree(s->our_kexinit);
+       if (pktin->length > 5)
+           hash_string(ssh->kex->hash, ssh->exhash,
+               pktin->data + 5, pktin->length - 5);
+
        if (s->warn_kex) {
            ssh_set_frozen(ssh, 1);
            s->dlgret = askalg(ssh->frontend, "key-exchange algorithm",
@@ -5983,16 +5993,6 @@ static void do_ssh2_transport(Ssh ssh, void *vin, int inlen,
            }
        }
 
-       ssh->exhash = ssh->kex->hash->init();
-       hash_string(ssh->kex->hash, ssh->exhash, ssh->v_c, strlen(ssh->v_c));
-       hash_string(ssh->kex->hash, ssh->exhash, ssh->v_s, strlen(ssh->v_s));
-       hash_string(ssh->kex->hash, ssh->exhash,
-           s->our_kexinit, s->our_kexinitlen);
-       sfree(s->our_kexinit);
-       if (pktin->length > 5)
-           hash_string(ssh->kex->hash, ssh->exhash,
-               pktin->data + 5, pktin->length - 5);
-
        if (s->ignorepkt) /* first_kex_packet_follows */
            crWaitUntilV(pktin);                /* Ignore packet */
     }
@@ -7543,7 +7543,9 @@ static void ssh2_setup_x11(struct ssh_channel *c, struct Packet *pktin,
     ssh2_pkt_adduint32(pktout, ssh->x11disp->screennum);
     ssh2_pkt_send(ssh, pktout);
 
-    crWaitUntilV(pktin);
+    /* Wait to be called back with either a response packet, or NULL
+     * meaning clean up and free our data */
+    crReturnV;
 
     if (pktin) {
         if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) {
@@ -7573,7 +7575,9 @@ static void ssh2_setup_agent(struct ssh_channel *c, struct Packet *pktin,
                                ssh2_setup_agent, s);
     ssh2_pkt_send(ssh, pktout);
 
-    crWaitUntilV(pktin);
+    /* Wait to be called back with either a response packet, or NULL
+     * meaning clean up and free our data */
+    crReturnV;
 
     if (pktin) {
         if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) {
@@ -7620,7 +7624,9 @@ static void ssh2_setup_pty(struct ssh_channel *c, struct Packet *pktin,
     ssh2_pkt_send(ssh, pktout);
     ssh->state = SSH_STATE_INTERMED;
 
-    crWaitUntilV(pktin);
+    /* Wait to be called back with either a response packet, or NULL
+     * meaning clean up and free our data */
+    crReturnV;
 
     if (pktin) {
         if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) {
@@ -7678,7 +7684,9 @@ static void ssh2_setup_env(struct ssh_channel *c, struct Packet *pktin,
        s->env_left = s->num_env;
 
        while (s->env_left > 0) {
-           crWaitUntilV(pktin);
+            /* Wait to be called back with either a response packet,
+             * or NULL meaning clean up and free our data */
+            crReturnV;
            if (!pktin) goto out;
            if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS)
                s->env_ok++;