Fix minor memory leak in Win32 SID handling functions. Not a big issue
authorMagnus Hagander
Mon, 27 Jul 2009 08:46:10 +0000 (08:46 +0000)
committerMagnus Hagander
Mon, 27 Jul 2009 08:46:10 +0000 (08:46 +0000)
since it's only called during process startup, thus no backpatch.

Found by TAKATSUKA Haruka, patch by Magnus Hagander and
Andrew Chernow

src/port/exec.c

index dde509eeeb692de604573ba3fcaa4142ac0214c8..75e64058cd1e9ed56f6b73edd5fa81d61ec8d029 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/port/exec.c,v 1.63 2009/06/11 14:49:15 momjian Exp $
+ *   $PostgreSQL: pgsql/src/port/exec.c,v 1.64 2009/07/27 08:46:10 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -56,7 +56,7 @@ static int    resolve_symlinks(char *path);
 static char *pipe_read_line(char *cmd, char *line, int maxsize);
 
 #ifdef WIN32
-static BOOL GetUserSid(PSID *ppSidUser, HANDLE hToken);
+static BOOL GetTokenUser(HANDLE hToken, PTOKEN_USER *ppTokenUser);
 #endif
 
 /*
@@ -697,7 +697,7 @@ AddUserToDacl(HANDLE hProcess)
    DWORD       dwTokenInfoLength = 0;
    HANDLE      hToken = NULL;
    PACL        pacl = NULL;
-   PSID        psidUser = NULL;
+   PTOKEN_USER pTokenUser = NULL;
    TOKEN_DEFAULT_DACL tddNew;
    TOKEN_DEFAULT_DACL *ptdd = NULL;
    TOKEN_INFORMATION_CLASS tic = TokenDefaultDacl;
@@ -744,15 +744,19 @@ AddUserToDacl(HANDLE hProcess)
        goto cleanup;
    }
 
-   /* Get the SID for the current user. We need to add this to the ACL. */
-   if (!GetUserSid(&psidUser, hToken))
+   /*
+    * Get the user token for the current user, which provides us with the
+    * SID that is needed for creating the ACL.
+    */
+   if (!GetTokenUser(hToken, &pTokenUser))
    {
-       log_error("could not get user SID: %lu", GetLastError());
+       log_error("could not get user token: %lu", GetLastError());
        goto cleanup;
    }
 
    /* Figure out the size of the new ACL */
-   dwNewAclSize = asi.AclBytesInUse + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(psidUser) -sizeof(DWORD);
+   dwNewAclSize = asi.AclBytesInUse + sizeof(ACCESS_ALLOWED_ACE) +
+       GetLengthSid(pTokenUser->User.Sid) -sizeof(DWORD);
 
    /* Allocate the ACL buffer & initialize it */
    pacl = (PACL) LocalAlloc(LPTR, dwNewAclSize);
@@ -785,7 +789,7 @@ AddUserToDacl(HANDLE hProcess)
    }
 
    /* Add the new ACE for the current user */
-   if (!AddAccessAllowedAce(pacl, ACL_REVISION, GENERIC_ALL, psidUser))
+   if (!AddAccessAllowedAce(pacl, ACL_REVISION, GENERIC_ALL, pTokenUser->User.Sid))
    {
        log_error("could not add access allowed ACE: %lu", GetLastError());
        goto cleanup;
@@ -803,8 +807,8 @@ AddUserToDacl(HANDLE hProcess)
    ret = TRUE;
 
 cleanup:
-   if (psidUser)
-       FreeSid(psidUser);
+   if (pTokenUser)
+       LocalFree((HLOCAL) pTokenUser);
 
    if (pacl)
        LocalFree((HLOCAL) pacl);
@@ -819,28 +823,31 @@ cleanup:
 }
 
 /*
- * GetUserSid*PSID *ppSidUser, HANDLE hToken)
+ * GetTokenUser(HANDLE hToken, PTOKEN_USER *ppTokenUser)
+ *
+ * Get the users token information from a process token.
  *
- * Get the SID for the current user
+ * The caller of this function is responsible for calling LocalFree() on the
+ * returned TOKEN_USER memory.
  */
 static BOOL
-GetUserSid(PSID *ppSidUser, HANDLE hToken)
+GetTokenUser(HANDLE hToken, PTOKEN_USER *ppTokenUser)
 {
    DWORD       dwLength;
-   PTOKEN_USER pTokenUser = NULL;
 
+   *ppTokenUser = NULL;
 
    if (!GetTokenInformation(hToken,
                             TokenUser,
-                            pTokenUser,
+                            NULL,
                             0,
                             &dwLength))
    {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
        {
-           pTokenUser = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);
+           *ppTokenUser = (PTOKEN_USER) LocalAlloc(LPTR, dwLength);
 
-           if (pTokenUser == NULL)
+           if (*ppTokenUser == NULL)
            {
                log_error("could not allocate %lu bytes of memory", dwLength);
                return FALSE;
@@ -855,18 +862,18 @@ GetUserSid(PSID *ppSidUser, HANDLE hToken)
 
    if (!GetTokenInformation(hToken,
                             TokenUser,
-                            pTokenUser,
+                            *ppTokenUser,
                             dwLength,
                             &dwLength))
    {
-       HeapFree(GetProcessHeap(), 0, pTokenUser);
-       pTokenUser = NULL;
+       LocalFree(*ppTokenUser);
+       *ppTokenUser = NULL;
 
        log_error("could not get token information: %lu", GetLastError());
        return FALSE;
    }
 
-   *ppSidUser = pTokenUser->User.Sid;
+   /* Memory in *ppTokenUser is LocalFree():d by the caller */
    return TRUE;
 }