From 42730f3cdf643d0faf7293435e608f24340537a5 Mon Sep 17 00:00:00 2001 From: Aleksander Alekseev Date: Thu, 15 Sep 2022 15:35:50 +0300 Subject: [PATCH v2] Replace LocalAlloc/LocalFree with HeapAlloc/HeapFree According to MSDN, new applications should use the Heap* functions unless documentation states that a Local* function should be used. See: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-localalloc Although the use of Local* WinAPIs family doesn't seem to cause any particular problems at present, it's trivial to replace them with Heap* family, so simply do this. Author: Ranier Vilela Reviewed-by: Aleksander Alekseev Discussion: https://postgr.es/m/CAEudQAo3etqZWk5tht-2TCgo6JLGAFonn1pbaWY2ioaNXiBNNA%40mail.gmail.com --- src/common/exec.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/common/exec.c b/src/common/exec.c index 22f04aafbe..967c70a81c 100644 --- a/src/common/exec.c +++ b/src/common/exec.c @@ -561,13 +561,23 @@ AddUserToTokenDacl(HANDLE hToken) TOKEN_DEFAULT_DACL *ptdd = NULL; TOKEN_INFORMATION_CLASS tic = TokenDefaultDacl; BOOL ret = FALSE; + HANDLE hDefaultProcessHeap; + + hDefaultProcessHeap = GetProcessHeap(); + if (unlikely(hDefaultProcessHeap == NULL)) + { + log_error(errcode(ERRCODE_SYSTEM_ERROR), + "could not get default process heap: error code %lu", + GetLastError()); + return FALSE; + } /* Figure out the buffer size for the DACL info */ if (!GetTokenInformation(hToken, tic, (LPVOID) NULL, dwTokenInfoLength, &dwSize)) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { - ptdd = (TOKEN_DEFAULT_DACL *) LocalAlloc(LPTR, dwSize); + ptdd = (TOKEN_DEFAULT_DACL *) HeapAlloc(hDefaultProcessHeap, 0, dwSize); if (ptdd == NULL) { log_error(errcode(ERRCODE_OUT_OF_MEMORY), @@ -612,7 +622,7 @@ AddUserToTokenDacl(HANDLE hToken) GetLengthSid(pTokenUser->User.Sid) - sizeof(DWORD); /* Allocate the ACL buffer & initialize it */ - pacl = (PACL) LocalAlloc(LPTR, dwNewAclSize); + pacl = (PACL) HeapAlloc(hDefaultProcessHeap, 0, dwNewAclSize); if (pacl == NULL) { log_error(errcode(ERRCODE_OUT_OF_MEMORY), @@ -669,13 +679,13 @@ AddUserToTokenDacl(HANDLE hToken) cleanup: if (pTokenUser) - LocalFree((HLOCAL) pTokenUser); + HeapFree(hDefaultProcessHeap, 0, pTokenUser); if (pacl) - LocalFree((HLOCAL) pacl); + HeapFree(hDefaultProcessHeap, 0, pacl); if (ptdd) - LocalFree((HLOCAL) ptdd); + HeapFree(hDefaultProcessHeap, 0, ptdd); return ret; } @@ -685,16 +695,26 @@ cleanup: * * Get the users token information from a process token. * - * The caller of this function is responsible for calling LocalFree() on the + * The caller of this function is responsible for calling HeapFree() on the * returned TOKEN_USER memory. */ static BOOL GetTokenUser(HANDLE hToken, PTOKEN_USER *ppTokenUser) { DWORD dwLength; + HANDLE hDefaultProcessHeap; *ppTokenUser = NULL; + hDefaultProcessHeap = GetProcessHeap(); + if (unlikely(hDefaultProcessHeap == NULL)) + { + log_error(errcode(ERRCODE_SYSTEM_ERROR), + "could not get default process heap: error code %lu", + GetLastError()); + return FALSE; + } + if (!GetTokenInformation(hToken, TokenUser, NULL, @@ -703,7 +723,7 @@ GetTokenUser(HANDLE hToken, PTOKEN_USER *ppTokenUser) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { - *ppTokenUser = (PTOKEN_USER) LocalAlloc(LPTR, dwLength); + *ppTokenUser = (PTOKEN_USER) HeapAlloc(hDefaultProcessHeap, 0, dwLength); if (*ppTokenUser == NULL) { @@ -727,7 +747,7 @@ GetTokenUser(HANDLE hToken, PTOKEN_USER *ppTokenUser) dwLength, &dwLength)) { - LocalFree(*ppTokenUser); + HeapFree(hDefaultProcessHeap, 0, *ppTokenUser); *ppTokenUser = NULL; log_error(errcode(ERRCODE_SYSTEM_ERROR), @@ -736,7 +756,7 @@ GetTokenUser(HANDLE hToken, PTOKEN_USER *ppTokenUser) return FALSE; } - /* Memory in *ppTokenUser is LocalFree():d by the caller */ + /* Memory in *ppTokenUser is HeapFree():d by the caller */ return TRUE; } -- 2.37.2