Make memory management uniform: _everything_ now goes through the
[u/mdw/putty] / winstore.c
index 48d4f6c..fd53ecf 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <windows.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include "putty.h"
 #include "storage.h"
 
@@ -57,16 +58,16 @@ void *open_settings_w(char *sessionname) {
     int ret;
     char *p;
 
-    p = malloc(3*strlen(sessionname)+1);
+    p = smalloc(3*strlen(sessionname)+1);
     mungestr(sessionname, p);
     
     ret = RegCreateKey(HKEY_CURRENT_USER, puttystr, &subkey1);
     if (ret != ERROR_SUCCESS) {
-        free(p);
+        sfree(p);
         return NULL;
     }
     ret = RegCreateKey(subkey1, p, &sesskey);
-    free(p);
+    sfree(p);
     RegCloseKey(subkey1);
     if (ret != ERROR_SUCCESS)
         return NULL;
@@ -92,7 +93,7 @@ void *open_settings_r(char *sessionname) {
     HKEY subkey1, sesskey;
     char *p;
 
-    p = malloc(3*strlen(sessionname)+1);
+    p = smalloc(3*strlen(sessionname)+1);
     mungestr(sessionname, p);
 
     if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS) {
@@ -104,7 +105,7 @@ void *open_settings_r(char *sessionname) {
        RegCloseKey(subkey1);
     }
 
-    free(p);
+    sfree(p);
 
     return (void *)sesskey;
 }
@@ -146,20 +147,14 @@ void del_settings (char *sessionname) {
     if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS)
        return;
 
-    p = malloc(3*strlen(sessionname)+1);
+    p = smalloc(3*strlen(sessionname)+1);
     mungestr(sessionname, p);
     RegDeleteKey(subkey1, p);
-    free(p);
+    sfree(p);
 
     RegCloseKey(subkey1);
 }
 
-static void hostkey_regname(char *buffer, char *hostname, char *keytype) {
-    strcpy(buffer, keytype);
-    strcat(buffer, "@");
-    mungestr(hostname, buffer + strlen(buffer));
-}
-
 struct enumsettings {
     HKEY key;
     int i;
@@ -172,7 +167,7 @@ void *enum_settings_start(void) {
     if (RegCreateKey(HKEY_CURRENT_USER, puttystr, &key) != ERROR_SUCCESS)
         return NULL;
 
-    ret = malloc(sizeof(*ret));
+    ret = smalloc(sizeof(*ret));
     if (ret) {
         ret->key = key;
         ret->i = 0;
@@ -184,11 +179,11 @@ void *enum_settings_start(void) {
 char *enum_settings_next(void *handle, char *buffer, int buflen) {
     struct enumsettings *e = (struct enumsettings *)handle;
     char *otherbuf;
-    otherbuf = malloc(3*buflen);
+    otherbuf = smalloc(3*buflen);
     if (otherbuf && RegEnumKey(e->key, e->i++, otherbuf,
                                3*buflen) == ERROR_SUCCESS) {
         unmungestr(otherbuf, buffer, buflen);
-        free(otherbuf);
+        sfree(otherbuf);
         return buffer;
     } else
         return NULL;
@@ -198,10 +193,20 @@ char *enum_settings_next(void *handle, char *buffer, int buflen) {
 void enum_settings_finish(void *handle) {
     struct enumsettings *e = (struct enumsettings *)handle;
     RegCloseKey(e->key);
-    free(e);
+    sfree(e);
+}
+
+static void hostkey_regname(char *buffer, char *hostname,
+                            int port, char *keytype) {
+    int len;
+    strcpy(buffer, keytype);
+    strcat(buffer, "@");
+    len = strlen(buffer);
+    len += sprintf(buffer+len, "%d:", port);
+    mungestr(hostname, buffer + strlen(buffer));
 }
 
-int verify_host_key(char *hostname, char *keytype, char *key) {
+int verify_host_key(char *hostname, int port, char *keytype, char *key) {
     char *otherstr, *regname;
     int len;
     HKEY rkey;
@@ -216,11 +221,9 @@ int verify_host_key(char *hostname, char *keytype, char *key) {
      * says.
      */
     otherstr = smalloc(len);
-    regname = smalloc(3*(strlen(hostname)+strlen(keytype))+5);
-    if (!otherstr || !regname)
-       fatalbox("Out of memory");
+    regname = smalloc(3*(strlen(hostname)+strlen(keytype))+15);
 
-    hostkey_regname(regname, hostname, keytype);
+    hostkey_regname(regname, hostname, port, keytype);
 
     if (RegCreateKey(HKEY_CURRENT_USER, PUTTY_REG_POS "\\SshHostKeys",
                     &rkey) != ERROR_SUCCESS)
@@ -236,7 +239,7 @@ int verify_host_key(char *hostname, char *keytype, char *key) {
          * another trick, which is to look up the _old_ key format
          * under just the hostname and translate that.
          */
-        char *justhost = regname + 1 + strlen(keytype);
+        char *justhost = regname + 1 + strcspn(regname, ":");
         char *oldstyle = smalloc(len + 10);   /* safety margin */
         readlen = len;
         ret = RegQueryValueEx(rkey, justhost, NULL, &type,
@@ -306,15 +309,13 @@ int verify_host_key(char *hostname, char *keytype, char *key) {
         return 0;                      /* key matched OK in registry */
 }
 
-void store_host_key(char *hostname, char *keytype, char *key) {
+void store_host_key(char *hostname, int port, char *keytype, char *key) {
     char *regname;
     HKEY rkey;
 
-    regname = smalloc(3*(strlen(hostname)+strlen(keytype))+5);
-    if (!regname)
-       fatalbox("Out of memory");
+    regname = smalloc(3*(strlen(hostname)+strlen(keytype))+15);
 
-    hostkey_regname(regname, hostname, keytype);
+    hostkey_regname(regname, hostname, port, keytype);
 
     if (RegCreateKey(HKEY_CURRENT_USER, PUTTY_REG_POS "\\SshHostKeys",
                     &rkey) != ERROR_SUCCESS)