Eric Pouech : advapi32: Plug a couple of memory leaks.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Oct 20 08:00:37 CDT 2006
Module: wine
Branch: master
Commit: 4dfd319dbf65537a4c58dc62eef0c7e58828edf8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4dfd319dbf65537a4c58dc62eef0c7e58828edf8
Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date: Tue Oct 17 21:32:00 2006 +0200
advapi32: Plug a couple of memory leaks.
---
dlls/advapi32/lsa.c | 72 ++++++++++++++++++++++------------------
dlls/advapi32/registry.c | 24 +++++++++----
dlls/advapi32/tests/security.c | 4 ++
3 files changed, 60 insertions(+), 40 deletions(-)
diff --git a/dlls/advapi32/lsa.c b/dlls/advapi32/lsa.c
index 1d4323f..8c58334 100644
--- a/dlls/advapi32/lsa.c
+++ b/dlls/advapi32/lsa.c
@@ -56,15 +56,22 @@ static void dumpLsaAttributes(PLSA_OBJEC
}
}
-static void ADVAPI_GetDomainName(UNICODE_STRING * name)
+static void* ADVAPI_GetDomainName(unsigned sz, unsigned ofs)
{
HKEY key;
BOOL useDefault = TRUE;
LONG ret;
+ BYTE* ptr;
+ UNICODE_STRING* ustr;
- if ((ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
- "System\\CurrentControlSet\\Services\\VxD\\VNETSUP", 0,
- KEY_READ, &key)) == ERROR_SUCCESS)
+ static const WCHAR wVNETSUP[] = {
+ 'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'S','e','r','v','i','c','e','s','\\',
+ 'V','x','D','\\','V','N','E','T','S','U','P','\0'};
+
+ ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wVNETSUP, 0, KEY_READ, &key);
+ if (ret == ERROR_SUCCESS)
{
DWORD size = 0;
static const WCHAR wg[] = { 'W','o','r','k','g','r','o','u','p',0 };
@@ -72,26 +79,34 @@ static void ADVAPI_GetDomainName(UNICODE
ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size);
if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS)
{
- name->Buffer = HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY, size);
-
+ ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sz + size);
+ if (!ptr) return NULL;
+ ustr = (UNICODE_STRING*)(ptr + ofs);
+ ustr->MaximumLength = size;
+ ustr->Buffer = (WCHAR*)(ptr + sz);
if ((ret = RegQueryValueExW(key, wg, NULL, NULL,
- (LPBYTE)name->Buffer, &size)) == ERROR_SUCCESS)
+ (LPBYTE)ustr->Buffer, &size)) == ERROR_SUCCESS)
{
- name->Length = (USHORT)(size - sizeof(WCHAR));
- name->MaximumLength = (USHORT)size;
+ ustr->Length = (USHORT)(size - sizeof(WCHAR));
useDefault = FALSE;
}
else
- {
- HeapFree(GetProcessHeap(), 0, name->Buffer);
- name->Buffer = NULL;
- }
+ HeapFree(GetProcessHeap(), 0, ptr);
}
RegCloseKey(key);
}
if (useDefault)
- RtlCreateUnicodeStringFromAsciiz(name, "DOMAIN");
+ {
+ static const WCHAR wDomain[] = {'D','O','M','A','I','N','\0'};
+ ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ sz + sizeof(wDomain));
+ ustr = (UNICODE_STRING*)(ptr + ofs);
+ ustr->MaximumLength = sizeof(wDomain);
+ ustr->Buffer = (WCHAR*)(ptr + sz);
+ ustr->Length = (USHORT)(sizeof(wDomain) - sizeof(WCHAR));
+ memcpy(ustr->Buffer, wDomain, sizeof(wDomain));
+ }
+ return ptr;
}
/******************************************************************************
@@ -431,10 +446,8 @@ NTSTATUS WINAPI LsaQueryInformationPolic
/* Only the domain name is valid for the local computer.
* All other fields are zero.
*/
- PPOLICY_PRIMARY_DOMAIN_INFO pinfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(POLICY_PRIMARY_DOMAIN_INFO));
-
- ADVAPI_GetDomainName(&pinfo->Name);
+ PPOLICY_PRIMARY_DOMAIN_INFO pinfo;
+ pinfo = ADVAPI_GetDomainName(sizeof(*pinfo), (char*)&pinfo->Name - (char*)pinfo);
TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer));
@@ -448,28 +461,24 @@ NTSTATUS WINAPI LsaQueryInformationPolic
POLICY_ACCOUNT_DOMAIN_INFO info;
SID sid;
DWORD padding[3];
+ WCHAR domain[MAX_COMPUTERNAME_LENGTH + 1];
};
- struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
- LPWSTR buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize * sizeof(WCHAR));
+ struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
xdi->info.DomainName.MaximumLength = dwSize * sizeof(WCHAR);
-
- if (GetComputerNameW(buf, &dwSize))
- {
- xdi->info.DomainName.Buffer = buf;
+ xdi->info.DomainName.Buffer = xdi->domain;
+ if (GetComputerNameW(xdi->info.DomainName.Buffer, &dwSize))
xdi->info.DomainName.Length = dwSize * sizeof(WCHAR);
- }
TRACE("setting name to %s\n", debugstr_w(xdi->info.DomainName.Buffer));
- xdi->info.DomainSid = &(xdi->sid);
+ xdi->info.DomainSid = &xdi->sid;
/* read the computer SID from the registry */
- if (!ADVAPI_GetComputerSid(&(xdi->sid)))
+ if (!ADVAPI_GetComputerSid(&xdi->sid))
{
- HeapFree(GetProcessHeap(), 0, buf);
HeapFree(GetProcessHeap(), 0, xdi);
WARN("Computer SID not found\n");
@@ -487,10 +496,9 @@ NTSTATUS WINAPI LsaQueryInformationPolic
/* Only the domain name is valid for the local computer.
* All other fields are zero.
*/
- PPOLICY_DNS_DOMAIN_INFO pinfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(POLICY_DNS_DOMAIN_INFO));
+ PPOLICY_DNS_DOMAIN_INFO pinfo;
- ADVAPI_GetDomainName(&pinfo->Name);
+ pinfo = ADVAPI_GetDomainName(sizeof(*pinfo), (char*)&pinfo->Name - (char*)pinfo);
TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer));
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 74b3f77..162a9c3 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -1887,6 +1887,7 @@ LONG WINAPI RegLoadKeyW( HKEY hkey, LPCW
{
OBJECT_ATTRIBUTES destkey, file;
UNICODE_STRING subkeyW, filenameW;
+ NTSTATUS status;
if (!(hkey = get_special_root_hkey(hkey))) return ERROR_INVALID_HANDLE;
@@ -1906,7 +1907,9 @@ LONG WINAPI RegLoadKeyW( HKEY hkey, LPCW
file.SecurityQualityOfService = NULL;
RtlDosPathNameToNtPathName_U(filename, &filenameW, NULL, NULL);
- return RtlNtStatusToDosError( NtLoadKey(&destkey, &file) );
+ status = NtLoadKey(&destkey, &file);
+ RtlFreeUnicodeString(&filenameW);
+ return RtlNtStatusToDosError( status );
}
@@ -1920,17 +1923,22 @@ LONG WINAPI RegLoadKeyA( HKEY hkey, LPCS
UNICODE_STRING subkeyW, filenameW;
STRING subkeyA, filenameA;
NTSTATUS status;
+ LONG ret;
RtlInitAnsiString(&subkeyA, subkey);
RtlInitAnsiString(&filenameA, filename);
- if ((status = RtlAnsiStringToUnicodeString(&subkeyW, &subkeyA, TRUE)))
- return RtlNtStatusToDosError(status);
-
- if ((status = RtlAnsiStringToUnicodeString(&filenameW, &filenameA, TRUE)))
- return RtlNtStatusToDosError(status);
-
- return RegLoadKeyW(hkey, subkeyW.Buffer, filenameW.Buffer);
+ RtlInitUnicodeString(&subkeyW, NULL);
+ RtlInitUnicodeString(&filenameW, NULL);
+ if (!(status = RtlAnsiStringToUnicodeString(&subkeyW, &subkeyA, TRUE)) &&
+ !(status = RtlAnsiStringToUnicodeString(&filenameW, &filenameA, TRUE)))
+ {
+ ret = RegLoadKeyW(hkey, subkeyW.Buffer, filenameW.Buffer);
+ }
+ else ret = RtlNtStatusToDosError(status);
+ RtlFreeUnicodeString(&subkeyW);
+ RtlFreeUnicodeString(&filenameW);
+ return ret;
}
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index e0891ad..54112d2 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -100,6 +100,7 @@ static void test_str_sid(const char *str
trace(" %s: %s\n", str_sid, temp);
LocalFree(temp);
}
+ LocalFree(psid);
}
else
{
@@ -833,6 +834,7 @@ static void test_token_attr(void)
pConvertSidToStringSidA(User->User.Sid, &SidString);
trace("TokenUser: %s attr: 0x%08x\n", SidString, User->User.Attributes);
LocalFree(SidString);
+ HeapFree(GetProcessHeap(), 0, User);
/* privileges */
ret = GetTokenInformation(Token, TokenPrivileges, NULL, 0, &Size);
@@ -1044,6 +1046,8 @@ static void test_LookupAccountSid(void)
"LookupAccountSidW() Expected dom_size = %u, got %u\n",
real_dom_sizeW + 1, dom_sizeW);
+ FreeSid(pUsersSid);
+
pCreateWellKnownSid = (fnCreateWellKnownSid)GetProcAddress( hmod, "CreateWellKnownSid" );
if (pCreateWellKnownSid && pConvertSidToStringSidA)
More information about the wine-cvs
mailing list