X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/d1622aed96258feca49be59e4459f4b29027492a..01c034ad857128c51482a563befb374e38ebe668:/winstore.c diff --git a/winstore.c b/winstore.c index 48d4f6cd..fd53ecf1 100644 --- a/winstore.c +++ b/winstore.c @@ -5,6 +5,7 @@ #include #include +#include #include "putty.h" #include "storage.h" @@ -57,16 +58,16 @@ void *open_settings_w(char *sessionname) { int ret; char *p; - p = malloc(3*strlen(sessionname)+1); + p = smalloc(3*strlen(sessionname)+1); mungestr(sessionname, p); ret = RegCreateKey(HKEY_CURRENT_USER, puttystr, &subkey1); if (ret != ERROR_SUCCESS) { - free(p); + sfree(p); return NULL; } ret = RegCreateKey(subkey1, p, &sesskey); - free(p); + sfree(p); RegCloseKey(subkey1); if (ret != ERROR_SUCCESS) return NULL; @@ -92,7 +93,7 @@ void *open_settings_r(char *sessionname) { HKEY subkey1, sesskey; char *p; - p = malloc(3*strlen(sessionname)+1); + p = smalloc(3*strlen(sessionname)+1); mungestr(sessionname, p); if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS) { @@ -104,7 +105,7 @@ void *open_settings_r(char *sessionname) { RegCloseKey(subkey1); } - free(p); + sfree(p); return (void *)sesskey; } @@ -146,20 +147,14 @@ void del_settings (char *sessionname) { if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS) return; - p = malloc(3*strlen(sessionname)+1); + p = smalloc(3*strlen(sessionname)+1); mungestr(sessionname, p); RegDeleteKey(subkey1, p); - free(p); + sfree(p); RegCloseKey(subkey1); } -static void hostkey_regname(char *buffer, char *hostname, char *keytype) { - strcpy(buffer, keytype); - strcat(buffer, "@"); - mungestr(hostname, buffer + strlen(buffer)); -} - struct enumsettings { HKEY key; int i; @@ -172,7 +167,7 @@ void *enum_settings_start(void) { if (RegCreateKey(HKEY_CURRENT_USER, puttystr, &key) != ERROR_SUCCESS) return NULL; - ret = malloc(sizeof(*ret)); + ret = smalloc(sizeof(*ret)); if (ret) { ret->key = key; ret->i = 0; @@ -184,11 +179,11 @@ void *enum_settings_start(void) { char *enum_settings_next(void *handle, char *buffer, int buflen) { struct enumsettings *e = (struct enumsettings *)handle; char *otherbuf; - otherbuf = malloc(3*buflen); + otherbuf = smalloc(3*buflen); if (otherbuf && RegEnumKey(e->key, e->i++, otherbuf, 3*buflen) == ERROR_SUCCESS) { unmungestr(otherbuf, buffer, buflen); - free(otherbuf); + sfree(otherbuf); return buffer; } else return NULL; @@ -198,10 +193,20 @@ char *enum_settings_next(void *handle, char *buffer, int buflen) { void enum_settings_finish(void *handle) { struct enumsettings *e = (struct enumsettings *)handle; RegCloseKey(e->key); - free(e); + sfree(e); +} + +static void hostkey_regname(char *buffer, char *hostname, + int port, char *keytype) { + int len; + strcpy(buffer, keytype); + strcat(buffer, "@"); + len = strlen(buffer); + len += sprintf(buffer+len, "%d:", port); + mungestr(hostname, buffer + strlen(buffer)); } -int verify_host_key(char *hostname, char *keytype, char *key) { +int verify_host_key(char *hostname, int port, char *keytype, char *key) { char *otherstr, *regname; int len; HKEY rkey; @@ -216,11 +221,9 @@ int verify_host_key(char *hostname, char *keytype, char *key) { * says. */ otherstr = smalloc(len); - regname = smalloc(3*(strlen(hostname)+strlen(keytype))+5); - if (!otherstr || !regname) - fatalbox("Out of memory"); + regname = smalloc(3*(strlen(hostname)+strlen(keytype))+15); - hostkey_regname(regname, hostname, keytype); + hostkey_regname(regname, hostname, port, keytype); if (RegCreateKey(HKEY_CURRENT_USER, PUTTY_REG_POS "\\SshHostKeys", &rkey) != ERROR_SUCCESS) @@ -236,7 +239,7 @@ int verify_host_key(char *hostname, char *keytype, char *key) { * another trick, which is to look up the _old_ key format * under just the hostname and translate that. */ - char *justhost = regname + 1 + strlen(keytype); + char *justhost = regname + 1 + strcspn(regname, ":"); char *oldstyle = smalloc(len + 10); /* safety margin */ readlen = len; ret = RegQueryValueEx(rkey, justhost, NULL, &type, @@ -306,15 +309,13 @@ int verify_host_key(char *hostname, char *keytype, char *key) { return 0; /* key matched OK in registry */ } -void store_host_key(char *hostname, char *keytype, char *key) { +void store_host_key(char *hostname, int port, char *keytype, char *key) { char *regname; HKEY rkey; - regname = smalloc(3*(strlen(hostname)+strlen(keytype))+5); - if (!regname) - fatalbox("Out of memory"); + regname = smalloc(3*(strlen(hostname)+strlen(keytype))+15); - hostkey_regname(regname, hostname, keytype); + hostkey_regname(regname, hostname, port, keytype); if (RegCreateKey(HKEY_CURRENT_USER, PUTTY_REG_POS "\\SshHostKeys", &rkey) != ERROR_SUCCESS)