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];
/* 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("");
}
sessionname, "'", NULL);
} else {
assert(appname);
- desc_string = dupprintf("Run %.*s", strcspn(appname, "."), appname);
+ desc_string = dupprintf("Run %.*s",
+ (int)strcspn(appname, "."), appname);
}
ret->lpVtbl->SetDescription(ret, desc_string);
sfree(desc_string);
pv.pszVal = dupstr(sessionname);
} else {
assert(appname);
- pv.pszVal = dupprintf("Run %.*s", strcspn(appname, "."), appname);
+ pv.pszVal = dupprintf("Run %.*s",
+ (int)strcspn(appname, "."), appname);
}
pPS->lpVtbl->SetValue(pPS, &PKEY_Title, &pv);
sfree(pv.pszVal);
void clear_jumplist(void)
{
ICustomDestinationList *pCDL;
- UINT num_items;
- IObjectArray *pRemoved;
if (CoCreateInstance(&CLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER,
COMPTR(ICustomDestinationList, &pCDL)) == S_OK) {