#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
+#include <assert.h>
#include "putty.h"
#include "storage.h"
return (void *) sesskey;
}
-char *read_setting_s(void *handle, const char *key, char *buffer, int buflen)
+char *read_setting_s(void *handle, const char *key)
{
- DWORD type, size;
- size = buflen;
+ DWORD type, allocsize, size;
+ char *ret;
- if (!handle ||
- RegQueryValueEx((HKEY) handle, key, 0,
- &type, buffer, &size) != ERROR_SUCCESS ||
- type != REG_SZ) return NULL;
- else
- return buffer;
+ if (!handle)
+ return NULL;
+
+ /* Find out the type and size of the data. */
+ if (RegQueryValueEx((HKEY) handle, key, 0,
+ &type, NULL, &size) != ERROR_SUCCESS ||
+ type != REG_SZ)
+ return NULL;
+
+ 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) {
+ sfree(ret);
+ return NULL;
+ }
+ assert(size < allocsize);
+ ret[size] = '\0'; /* add an extra NUL in case RegQueryValueEx
+ * didn't supply one */
+
+ return ret;
}
int read_setting_i(void *handle, const char *key, int defvalue)
return val;
}
-int read_setting_fontspec(void *handle, const char *name, FontSpec *result)
+FontSpec *read_setting_fontspec(void *handle, const char *name)
{
char *settingname;
- FontSpec ret;
+ char *fontname;
+ FontSpec *ret;
+ int isbold, height, charset;
+
+ fontname = read_setting_s(handle, name);
+ if (!fontname)
+ return NULL;
- if (!read_setting_s(handle, name, ret.name, sizeof(ret.name)))
- return 0;
settingname = dupcat(name, "IsBold", NULL);
- ret.isbold = read_setting_i(handle, settingname, -1);
+ isbold = read_setting_i(handle, settingname, -1);
sfree(settingname);
- if (ret.isbold == -1) return 0;
+ if (isbold == -1) {
+ sfree(fontname);
+ return NULL;
+ }
+
settingname = dupcat(name, "CharSet", NULL);
- ret.charset = read_setting_i(handle, settingname, -1);
+ charset = read_setting_i(handle, settingname, -1);
sfree(settingname);
- if (ret.charset == -1) return 0;
+ if (charset == -1) {
+ sfree(fontname);
+ return NULL;
+ }
+
settingname = dupcat(name, "Height", NULL);
- ret.height = read_setting_i(handle, settingname, INT_MIN);
+ height = read_setting_i(handle, settingname, INT_MIN);
sfree(settingname);
- if (ret.height == INT_MIN) return 0;
- *result = ret;
- return 1;
+ if (height == INT_MIN) {
+ sfree(fontname);
+ return NULL;
+ }
+
+ ret = fontspec_new(fontname, isbold, height, charset);
+ sfree(fontname);
+ return ret;
}
-void write_setting_fontspec(void *handle, const char *name, FontSpec font)
+void write_setting_fontspec(void *handle, const char *name, FontSpec *font)
{
char *settingname;
- write_setting_s(handle, name, font.name);
+ write_setting_s(handle, name, font->name);
settingname = dupcat(name, "IsBold", NULL);
- write_setting_i(handle, settingname, font.isbold);
+ write_setting_i(handle, settingname, font->isbold);
sfree(settingname);
settingname = dupcat(name, "CharSet", NULL);
- write_setting_i(handle, settingname, font.charset);
+ write_setting_i(handle, settingname, font->charset);
sfree(settingname);
settingname = dupcat(name, "Height", NULL);
- write_setting_i(handle, settingname, font.height);
+ write_setting_i(handle, settingname, font->height);
sfree(settingname);
}
-int read_setting_filename(void *handle, const char *name, Filename *result)
+Filename *read_setting_filename(void *handle, const char *name)
{
- return !!read_setting_s(handle, name, result->path, sizeof(result->path));
+ char *tmp = read_setting_s(handle, name);
+ if (tmp) {
+ Filename *ret = filename_from_str(tmp);
+ sfree(tmp);
+ return ret;
+ } else
+ return NULL;
}
-void write_setting_filename(void *handle, const char *name, Filename result)
+void write_setting_filename(void *handle, const char *name, Filename *result)
{
- write_setting_s(handle, name, result.path);
+ write_setting_s(handle, name, result->path);
}
void close_settings_r(void *handle)
* 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 &&
RegSetValueEx(rkey, regname, 0, REG_SZ, otherstr,
strlen(otherstr) + 1);
}
+
+ sfree(oldstyle);
}
RegCloseKey(rkey);
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)
{
static int try_random_seed(char const *path, int action, HANDLE *ret)
{
if (action == DEL) {
- remove(path);
+ if (!DeleteFile(path) && GetLastError() != ERROR_FILE_NOT_FOUND) {
+ nonfatal("Unable to delete '%s': %s", path,
+ win_strerror(GetLastError()));
+ }
*ret = INVALID_HANDLE_VALUE;
return FALSE; /* so we'll do the next ones too */
}
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;
ret = RegSetValueEx(pjumplist_key, reg_jumplist_value, 0, REG_MULTI_SZ,
new_value, piterator_new - new_value);
+ sfree(old_value);
old_value = new_value;
- sfree(new_value);
} else
ret = ERROR_SUCCESS;
/*
* Either return or free the result.
*/
- if (out)
+ if (out && ret == ERROR_SUCCESS)
*out = old_value;
else
sfree(old_value);
{
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';