Another big batch of memory leak fixes, again mostly on error paths.
[u/mdw/putty] / windows / winstore.c
index 66c7c75..47fef67 100644 (file)
@@ -167,7 +167,10 @@ char *read_setting_s(void *handle, const char *key)
     ret = snewn(size+1, char);
     if (RegQueryValueEx((HKEY) handle, key, 0,
                        &type, ret, &size) != ERROR_SUCCESS ||
-       type != REG_SZ) return NULL;
+       type != REG_SZ) {
+        sfree(ret);
+        return NULL;
+    }
 
     return ret;
 }
@@ -190,6 +193,7 @@ FontSpec *read_setting_fontspec(void *handle, const char *name)
 {
     char *settingname;
     char *fontname;
+    FontSpec *ret;
     int isbold, height, charset;
 
     fontname = read_setting_s(handle, name);
@@ -199,19 +203,30 @@ FontSpec *read_setting_fontspec(void *handle, const char *name)
     settingname = dupcat(name, "IsBold", NULL);
     isbold = read_setting_i(handle, settingname, -1);
     sfree(settingname);
-    if (isbold == -1) return NULL;
+    if (isbold == -1) {
+        sfree(fontname);
+        return NULL;
+    }
 
     settingname = dupcat(name, "CharSet", NULL);
     charset = read_setting_i(handle, settingname, -1);
     sfree(settingname);
-    if (charset == -1) return NULL;
+    if (charset == -1) {
+        sfree(fontname);
+        return NULL;
+    }
 
     settingname = dupcat(name, "Height", NULL);
     height = read_setting_i(handle, settingname, INT_MIN);
     sfree(settingname);
-    if (height == INT_MIN) return NULL;
+    if (height == INT_MIN) {
+        sfree(fontname);
+        return NULL;
+    }
 
-    return fontspec_new(fontname, isbold, height, charset);
+    ret = fontspec_new(fontname, isbold, height, charset);
+    sfree(fontname);
+    return ret;
 }
 
 void write_setting_fontspec(void *handle, const char *name, FontSpec *font)
@@ -340,16 +355,18 @@ int verify_host_key(const char *hostname, int port,
      * Now read a saved key in from the registry and see what it
      * says.
      */
-    otherstr = snewn(len, char);
     regname = snewn(3 * (strlen(hostname) + strlen(keytype)) + 15, char);
 
     hostkey_regname(regname, hostname, port, keytype);
 
     if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS "\\SshHostKeys",
-                  &rkey) != ERROR_SUCCESS)
+                  &rkey) != ERROR_SUCCESS) {
+        sfree(regname);
        return 1;                      /* key does not exist in registry */
+    }
 
     readlen = len;
+    otherstr = snewn(len, char);
     ret = RegQueryValueEx(rkey, regname, NULL, &type, otherstr, &readlen);
 
     if (ret != ERROR_SUCCESS && ret != ERROR_MORE_DATA &&
@@ -412,6 +429,8 @@ int verify_host_key(const char *hostname, int port,
                RegSetValueEx(rkey, regname, 0, REG_SZ, otherstr,
                              strlen(otherstr) + 1);
        }
+
+        sfree(oldstyle);
     }
 
     RegCloseKey(rkey);