mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-02 20:12:48 -05:00
Another big batch of memory leak fixes, again mostly on error paths.
The most interesting one is printer_add_enum, which I've modified to take a char ** rather than a char * so that it can both realloc its input buffer _and_ return NULL to indicate error. [originally from svn r9959]
This commit is contained in:
@ -167,7 +167,10 @@ char *read_setting_s(void *handle, const char *key)
|
||||
ret = snewn(size+1, char);
|
||||
if (RegQueryValueEx((HKEY) handle, key, 0,
|
||||
&type, ret, &size) != ERROR_SUCCESS ||
|
||||
type != REG_SZ) return NULL;
|
||||
type != REG_SZ) {
|
||||
sfree(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -190,6 +193,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 +203,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 +355,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 +429,8 @@ int verify_host_key(const char *hostname, int port,
|
||||
RegSetValueEx(rkey, regname, 0, REG_SZ, otherstr,
|
||||
strlen(otherstr) + 1);
|
||||
}
|
||||
|
||||
sfree(oldstyle);
|
||||
}
|
||||
|
||||
RegCloseKey(rkey);
|
||||
|
Reference in New Issue
Block a user