Plug a few minor memory leaks, based on a patch by Sirp Potijk.
authorjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Sun, 17 Jan 2010 16:20:45 +0000 (16:20 +0000)
committerjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Sun, 17 Jan 2010 16:20:45 +0000 (16:20 +0000)
While I'm here, add an assertion in sshrand.c to catch mistakes in reference
counting.

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

cmdline.c
ssh.c
sshrand.c

index 26f29c9..73c6f73 100644 (file)
--- a/cmdline.c
+++ b/cmdline.c
@@ -56,20 +56,30 @@ static void cmdline_save_param(char *p, char *value, int pri)
     saves[pri].nsaved++;
 }
 
+static char *cmdline_password = NULL;
+
 void cmdline_cleanup(void)
 {
     int pri;
 
-    for (pri = 0; pri < NPRIORITIES; pri++)
+    if (cmdline_password) {
+       memset(cmdline_password, 0, strlen(cmdline_password));
+       sfree(cmdline_password);
+       cmdline_password = NULL;
+    }
+    
+    for (pri = 0; pri < NPRIORITIES; pri++) {
        sfree(saves[pri].params);
+       saves[pri].params = NULL;
+       saves[pri].savesize = 0;
+       saves[pri].nsaved = 0;
+    }
 }
 
 #define SAVEABLE(pri) do { \
     if (need_save) { cmdline_save_param(p, value, pri); return ret; } \
 } while (0)
 
-static char *cmdline_password = NULL;
-
 /*
  * Similar interface to get_userpass_input(), except that here a -1
  * return means that we aren't capable of processing the prompt and
@@ -99,6 +109,8 @@ int cmdline_get_passwd_input(prompts_t *p, unsigned char *in, int inlen) {
            p->prompts[0]->result_len);
     p->prompts[0]->result[p->prompts[0]->result_len-1] = '\0';
     memset(cmdline_password, 0, strlen(cmdline_password));
+    sfree(cmdline_password);
+    cmdline_password = NULL;
     tried_once = 1;
     return 1;
 
diff --git a/ssh.c b/ssh.c
index 23afa6a..068db3c 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -2853,6 +2853,8 @@ static int ssh_do_close(Ssh ssh, int notify_exit)
            del234(ssh->portfwds, pf); /* moving next one to index 0 */
            free_portfwd(pf);
        }
+       freetree234(ssh->portfwds);
+       ssh->portfwds = NULL;
     }
 
     return ret;
index 26fcfe5..b728fd9 100644 (file)
--- a/sshrand.c
+++ b/sshrand.c
@@ -4,6 +4,7 @@
 
 #include "putty.h"
 #include "ssh.h"
+#include <assert.h>
 
 /* Collect environmental noise every 5 minutes */
 #define NOISE_REGULAR_INTERVAL (5*60*TICKSPERSEC)
@@ -225,6 +226,10 @@ void random_ref(void)
 void random_unref(void)
 {
     random_active--;
+    assert(random_active >= 0);
+    if (random_active) return;
+
+    expire_timer_context(&pool);
 }
 
 int random_byte(void)