From 42730f3cdf643d0faf7293435e608f24340537a5 Mon Sep 17 00:00:00 2001
From: Aleksander Alekseev <aleksander@timescale.com>
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 <ranier.vf@gmail.com>
Reviewed-by: Aleksander Alekseev <aleksander@timescale.com>
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

