mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-18 19:41:01 -05:00
Rewrite some manual char-buffer-handling code.
In the course of recent refactorings I noticed a couple of cases where we were doing old-fashioned preallocation of a char array with some conservative maximum size, then writing into it via *p++ or similar and hoping we got the calculation right. Now we have strbuf and dupcat, so we shouldn't ever have to do that. Fixed as many cases as I could find by searching for allocations of the form 'snewn(foo, char)'. Particularly worth a mention was the Windows GSSAPI setup code, which was directly using the Win32 Registry API, and looks much more legible using the windows/utils/registry.c wrappers. (But that was why I had to enhance them in the previous commit so as to be able to open registry keys read-only: without that, the open operation would actually fail on this key, which is not user-writable.) Also unix/askpass.c, which was doing a careful reallocation of its buffer to avoid secrets being left behind in the vacated memory - which is now just a matter of ensuring we called strbuf_new_nm().
This commit is contained in:
@ -118,7 +118,6 @@ static void add_library_to_never_unload_tree(HMODULE module)
|
||||
struct ssh_gss_liblist *ssh_gss_setup(Conf *conf)
|
||||
{
|
||||
HMODULE module;
|
||||
HKEY regkey;
|
||||
struct ssh_gss_liblist *list = snew(struct ssh_gss_liblist);
|
||||
char *path;
|
||||
static HMODULE kernel32_module;
|
||||
@ -137,55 +136,47 @@ struct ssh_gss_liblist *ssh_gss_setup(Conf *conf)
|
||||
|
||||
/* MIT Kerberos GSSAPI implementation */
|
||||
module = NULL;
|
||||
if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\MIT\\Kerberos", ®key)
|
||||
== ERROR_SUCCESS) {
|
||||
DWORD type, size;
|
||||
LONG ret;
|
||||
char *buffer;
|
||||
|
||||
/* Find out the string length */
|
||||
ret = RegQueryValueEx(regkey, "InstallDir", NULL, &type, NULL, &size);
|
||||
|
||||
if (ret == ERROR_SUCCESS && type == REG_SZ) {
|
||||
buffer = snewn(size + 20, char);
|
||||
ret = RegQueryValueEx(regkey, "InstallDir", NULL,
|
||||
&type, (LPBYTE)buffer, &size);
|
||||
if (ret == ERROR_SUCCESS && type == REG_SZ) {
|
||||
strcat (buffer, "\\bin");
|
||||
if(p_AddDllDirectory) {
|
||||
/* Add MIT Kerberos' path to the DLL search path,
|
||||
* it loads its own DLLs further down the road */
|
||||
wchar_t *dllPath =
|
||||
dup_mb_to_wc(DEFAULT_CODEPAGE, 0, buffer);
|
||||
p_AddDllDirectory(dllPath);
|
||||
sfree(dllPath);
|
||||
}
|
||||
strcat (buffer, "\\gssapi"MIT_KERB_SUFFIX".dll");
|
||||
module = LoadLibraryEx (buffer, NULL,
|
||||
LOAD_LIBRARY_SEARCH_SYSTEM32 |
|
||||
LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR |
|
||||
LOAD_LIBRARY_SEARCH_USER_DIRS);
|
||||
|
||||
/*
|
||||
* The MIT Kerberos DLL suffers an internal segfault
|
||||
* for some reason if you unload and reload one within
|
||||
* the same process. So, make sure that after we load
|
||||
* this library, we never free it.
|
||||
*
|
||||
* Or rather: after we've loaded it once, if any
|
||||
* _further_ load returns the same module handle, we
|
||||
* immediately free it again (to prevent the Windows
|
||||
* API's internal reference count growing without
|
||||
* bound). But on the other hand we never free it in
|
||||
* ssh_gss_cleanup.
|
||||
*/
|
||||
if (library_is_in_never_unload_tree(module))
|
||||
FreeLibrary(module);
|
||||
add_library_to_never_unload_tree(module);
|
||||
HKEY regkey = open_regkey_ro(HKEY_LOCAL_MACHINE,
|
||||
"SOFTWARE\\MIT\\Kerberos");
|
||||
if (regkey) {
|
||||
char *installdir = get_reg_sz(regkey, "InstallDir");
|
||||
if (installdir) {
|
||||
char *bindir = dupcat(installdir, "\\bin");
|
||||
if(p_AddDllDirectory) {
|
||||
/* Add MIT Kerberos' path to the DLL search path,
|
||||
* it loads its own DLLs further down the road */
|
||||
wchar_t *dllPath = dup_mb_to_wc(DEFAULT_CODEPAGE, 0, bindir);
|
||||
p_AddDllDirectory(dllPath);
|
||||
sfree(dllPath);
|
||||
}
|
||||
sfree(buffer);
|
||||
|
||||
char *dllfile = dupcat(bindir, "\\gssapi"MIT_KERB_SUFFIX".dll");
|
||||
module = LoadLibraryEx(dllfile, NULL,
|
||||
LOAD_LIBRARY_SEARCH_SYSTEM32 |
|
||||
LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR |
|
||||
LOAD_LIBRARY_SEARCH_USER_DIRS);
|
||||
|
||||
/*
|
||||
* The MIT Kerberos DLL suffers an internal segfault for
|
||||
* some reason if you unload and reload one within the
|
||||
* same process. So, make sure that after we load this
|
||||
* library, we never free it.
|
||||
*
|
||||
* Or rather: after we've loaded it once, if any _further_
|
||||
* load returns the same module handle, we immediately
|
||||
* free it again (to prevent the Windows API's internal
|
||||
* reference count growing without bound). But on the
|
||||
* other hand we never free it in ssh_gss_cleanup.
|
||||
*/
|
||||
if (library_is_in_never_unload_tree(module))
|
||||
FreeLibrary(module);
|
||||
add_library_to_never_unload_tree(module);
|
||||
|
||||
sfree(dllfile);
|
||||
sfree(bindir);
|
||||
sfree(installdir);
|
||||
}
|
||||
RegCloseKey(regkey);
|
||||
close_regkey(regkey);
|
||||
}
|
||||
if (module) {
|
||||
struct ssh_gss_library *lib =
|
||||
|
Reference in New Issue
Block a user