X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windows%2Fwinjump.c;h=eca5041a8dfa949da3e91321d494ffcf354c95c6;hb=a063e522970946bf7d5dc052079d7773c0dee76d;hp=4e69dd7467c67f0d72fe64065d6a83a31a8e8858;hpb=301d30c68e8625018893fee45236edbf4c6b70bc;p=PuTTY.git diff --git a/windows/winjump.c b/windows/winjump.c index 4e69dd74..eca5041a 100644 --- a/windows/winjump.c +++ b/windows/winjump.c @@ -353,12 +353,12 @@ static const PROPERTYKEY PKEY_Title = { 0x00000002 }; -/* 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. */ +/* Type-checking macro to provide arguments for CoCreateInstance() + * etc, ensuring that 'obj' really is a 'type **'. */ +#define typecheck(checkexpr, result) \ + (sizeof(checkexpr) ? (result) : (result)) #define COMPTR(type, obj) &IID_##type, \ - (void **)(void *)((obj) + (sizeof((obj)-(type **)(obj))) \ - - (sizeof((obj)-(type **)(obj)))) + typecheck((obj)-(type **)(obj), (void **)(void *)(obj)) static char putty_path[2048]; @@ -410,22 +410,30 @@ 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); if (sessionname) { - param_string = dupcat("@", sessionname, NULL); + /* The leading space is reported to work around a Windows 10 + * behaviour change in which an argument string starting with + * '@' causes the SetArguments method to silently do the wrong + * thing. */ + param_string = dupcat(" @", sessionname, NULL); } else { param_string = dupstr(""); } @@ -663,11 +671,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) {