Another big batch of memory leak fixes, again mostly on error paths.
[u/mdw/putty] / windows / winjump.c
index 6552e07..abefe44 100644 (file)
@@ -40,6 +40,11 @@ typedef struct _tagpropertykey {
 #define _REFPROPVARIANT_DEFINED
 typedef PROPVARIANT *REFPROPVARIANT;
 #endif
+/* MinGW doesn't define this yet: */
+#ifndef _PROPVARIANTINIT_DEFINED_
+#define _PROPVARIANTINIT_DEFINED_
+#define PropVariantInit(pvar) memset((pvar),0,sizeof(PROPVARIANT))
+#endif
 
 #define IID_IShellLink IID_IShellLinkA
 
@@ -348,7 +353,12 @@ static const PROPERTYKEY PKEY_Title = {
     0x00000002
 };
 
-#define COMPTR(type, obj) &IID_##type, ((sizeof((obj)-(type **)(obj))), (obj))
+/* Type-checking macro to provide arguments for CoCreateInstance() etc.
+ * The pointer arithmetic is a compile-time pointer type check that 'obj'
+ * really is a 'type **', but is intended to have no effect at runtime. */
+#define COMPTR(type, obj) &IID_##type, \
+    (void **)(void *)((obj) + (sizeof((obj)-(type **)(obj))) \
+                           - (sizeof((obj)-(type **)(obj))))
 
 static char putty_path[2048];
 
@@ -400,16 +410,20 @@ static IShellLink *make_shell_link(const char *appname,
     /* Check if this is a valid session, otherwise don't add. */
     if (sessionname) {
         psettings_tmp = open_settings_r(sessionname);
-        if (!psettings_tmp)
+        if (!psettings_tmp) {
+            sfree(app_path);
             return NULL;
+        }
         close_settings_r(psettings_tmp);
     }
 
     /* Create the new item. */
     if (!SUCCEEDED(CoCreateInstance(&CLSID_ShellLink, NULL,
                                     CLSCTX_INPROC_SERVER,
-                                    COMPTR(IShellLink, &ret))))
+                                    COMPTR(IShellLink, &ret)))) {
+        sfree(app_path);
         return NULL;
+    }
 
     /* Set path, parameters, icon and description. */
     ret->lpVtbl->SetPath(ret, app_path);
@@ -653,11 +667,9 @@ static void update_jumplist_from_registry(void)
 }
 
 /* Clears the entire jumplist. */
-static void clear_jumplist(void)
+void clear_jumplist(void)
 {
     ICustomDestinationList *pCDL;
-    UINT num_items;
-    IObjectArray *pRemoved;
 
     if (CoCreateInstance(&CLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER,
                          COMPTR(ICustomDestinationList, &pCDL)) == S_OK) {