X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windows%2Fwinstore.c;h=6944849658f5ff185df52bfee39e239a6dce31e0;hb=21101c7397e460933635a7bfed813864fc4f88fe;hp=66c7c759488681bc5fcd66d3ea42329c9a597b3a;hpb=888804eef75af9d82d39d5ee6eb3d607ac635820;p=PuTTY.git diff --git a/windows/winstore.c b/windows/winstore.c index 66c7c759..69448496 100644 --- a/windows/winstore.c +++ b/windows/winstore.c @@ -6,6 +6,7 @@ #include #include #include +#include #include "putty.h" #include "storage.h" @@ -152,7 +153,7 @@ void *open_settings_r(const char *sessionname) char *read_setting_s(void *handle, const char *key) { - DWORD type, size; + DWORD type, allocsize, size; char *ret; if (!handle) @@ -164,10 +165,17 @@ char *read_setting_s(void *handle, const char *key) type != REG_SZ) return NULL; - ret = snewn(size+1, char); + allocsize = size+1; /* allow for an extra NUL if needed */ + ret = snewn(allocsize, char); if (RegQueryValueEx((HKEY) handle, key, 0, &type, ret, &size) != ERROR_SUCCESS || - type != REG_SZ) return NULL; + type != REG_SZ) { + sfree(ret); + return NULL; + } + assert(size < allocsize); + ret[size] = '\0'; /* add an extra NUL in case RegQueryValueEx + * didn't supply one */ return ret; } @@ -190,6 +198,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 +208,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 +360,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 +434,8 @@ int verify_host_key(const char *hostname, int port, RegSetValueEx(rkey, regname, 0, REG_SZ, otherstr, strlen(otherstr) + 1); } + + sfree(oldstyle); } RegCloseKey(rkey); @@ -430,6 +454,16 @@ int verify_host_key(const char *hostname, int port, return 0; /* key matched OK in registry */ } +int have_ssh_host_key(const char *hostname, int port, + const char *keytype) +{ + /* + * If we have a host key, verify_host_key will return 0 or 2. + * If we don't have one, it'll return 1. + */ + return verify_host_key(hostname, port, keytype, "") != 1; +} + void store_host_key(const char *hostname, int port, const char *keytype, const char *key) { @@ -623,7 +657,7 @@ static int transform_jumplist_registry int ret; HKEY pjumplist_key, psettings_tmp; DWORD type; - int value_length; + DWORD value_length; char *old_value, *new_value; char *piterator_old, *piterator_new, *piterator_tmp; @@ -730,7 +764,7 @@ static int transform_jumplist_registry /* * Either return or free the result. */ - if (out) + if (out && ret == ERROR_SUCCESS) *out = old_value; else sfree(old_value); @@ -763,7 +797,7 @@ char *get_jumplist_registry_entries (void) { char *list_value; - if (transform_jumplist_registry(NULL,NULL,&list_value) != ERROR_SUCCESS) { + if (transform_jumplist_registry(NULL,NULL,&list_value) != JUMPLISTREG_OK) { list_value = snewn(2, char); *list_value = '\0'; *(list_value + 1) = '\0';