99 *
1010 *
1111 * IDENTIFICATION
12- * $PostgreSQL: pgsql/src/port/exec.c,v 1.63 2009/06/11 14:49:15 momjian Exp $
12+ * $PostgreSQL: pgsql/src/port/exec.c,v 1.64 2009/07/27 08:46:10 mha Exp $
1313 *
1414 *-------------------------------------------------------------------------
1515 */
@@ -56,7 +56,7 @@ static int resolve_symlinks(char *path);
5656static char * pipe_read_line (char * cmd , char * line , int maxsize );
5757
5858#ifdef WIN32
59- static BOOL GetUserSid ( PSID * ppSidUser , HANDLE hToken );
59+ static BOOL GetTokenUser ( HANDLE hToken , PTOKEN_USER * ppTokenUser );
6060#endif
6161
6262/*
@@ -697,7 +697,7 @@ AddUserToDacl(HANDLE hProcess)
697697 DWORD dwTokenInfoLength = 0 ;
698698 HANDLE hToken = NULL ;
699699 PACL pacl = NULL ;
700- PSID psidUser = NULL ;
700+ PTOKEN_USER pTokenUser = NULL ;
701701 TOKEN_DEFAULT_DACL tddNew ;
702702 TOKEN_DEFAULT_DACL * ptdd = NULL ;
703703 TOKEN_INFORMATION_CLASS tic = TokenDefaultDacl ;
@@ -744,15 +744,19 @@ AddUserToDacl(HANDLE hProcess)
744744 goto cleanup ;
745745 }
746746
747- /* Get the SID for the current user. We need to add this to the ACL. */
748- if (!GetUserSid (& psidUser , hToken ))
747+ /*
748+ * Get the user token for the current user, which provides us with the
749+ * SID that is needed for creating the ACL.
750+ */
751+ if (!GetTokenUser (hToken , & pTokenUser ))
749752 {
750- log_error ("could not get user SID : %lu" , GetLastError ());
753+ log_error ("could not get user token : %lu" , GetLastError ());
751754 goto cleanup ;
752755 }
753756
754757 /* Figure out the size of the new ACL */
755- dwNewAclSize = asi .AclBytesInUse + sizeof (ACCESS_ALLOWED_ACE ) + GetLengthSid (psidUser ) - sizeof (DWORD );
758+ dwNewAclSize = asi .AclBytesInUse + sizeof (ACCESS_ALLOWED_ACE ) +
759+ GetLengthSid (pTokenUser -> User .Sid ) - sizeof (DWORD );
756760
757761 /* Allocate the ACL buffer & initialize it */
758762 pacl = (PACL ) LocalAlloc (LPTR , dwNewAclSize );
@@ -785,7 +789,7 @@ AddUserToDacl(HANDLE hProcess)
785789 }
786790
787791 /* Add the new ACE for the current user */
788- if (!AddAccessAllowedAce (pacl , ACL_REVISION , GENERIC_ALL , psidUser ))
792+ if (!AddAccessAllowedAce (pacl , ACL_REVISION , GENERIC_ALL , pTokenUser -> User . Sid ))
789793 {
790794 log_error ("could not add access allowed ACE: %lu" , GetLastError ());
791795 goto cleanup ;
@@ -803,8 +807,8 @@ AddUserToDacl(HANDLE hProcess)
803807 ret = TRUE;
804808
805809cleanup :
806- if (psidUser )
807- FreeSid ( psidUser );
810+ if (pTokenUser )
811+ LocalFree (( HLOCAL ) pTokenUser );
808812
809813 if (pacl )
810814 LocalFree ((HLOCAL ) pacl );
@@ -819,28 +823,31 @@ AddUserToDacl(HANDLE hProcess)
819823}
820824
821825/*
822- * GetUserSid*PSID *ppSidUser, HANDLE hToken)
826+ * GetTokenUser(HANDLE hToken, PTOKEN_USER *ppTokenUser)
827+ *
828+ * Get the users token information from a process token.
823829 *
824- * Get the SID for the current user
830+ * The caller of this function is responsible for calling LocalFree() on the
831+ * returned TOKEN_USER memory.
825832 */
826833static BOOL
827- GetUserSid ( PSID * ppSidUser , HANDLE hToken )
834+ GetTokenUser ( HANDLE hToken , PTOKEN_USER * ppTokenUser )
828835{
829836 DWORD dwLength ;
830- PTOKEN_USER pTokenUser = NULL ;
831837
838+ * ppTokenUser = NULL ;
832839
833840 if (!GetTokenInformation (hToken ,
834841 TokenUser ,
835- pTokenUser ,
842+ NULL ,
836843 0 ,
837844 & dwLength ))
838845 {
839846 if (GetLastError () == ERROR_INSUFFICIENT_BUFFER )
840847 {
841- pTokenUser = (PTOKEN_USER ) HeapAlloc ( GetProcessHeap (), HEAP_ZERO_MEMORY , dwLength );
848+ * ppTokenUser = (PTOKEN_USER ) LocalAlloc ( LPTR , dwLength );
842849
843- if (pTokenUser == NULL )
850+ if (* ppTokenUser == NULL )
844851 {
845852 log_error ("could not allocate %lu bytes of memory" , dwLength );
846853 return FALSE;
@@ -855,18 +862,18 @@ GetUserSid(PSID *ppSidUser, HANDLE hToken)
855862
856863 if (!GetTokenInformation (hToken ,
857864 TokenUser ,
858- pTokenUser ,
865+ * ppTokenUser ,
859866 dwLength ,
860867 & dwLength ))
861868 {
862- HeapFree ( GetProcessHeap (), 0 , pTokenUser );
863- pTokenUser = NULL ;
869+ LocalFree ( * ppTokenUser );
870+ * ppTokenUser = NULL ;
864871
865872 log_error ("could not get token information: %lu" , GetLastError ());
866873 return FALSE;
867874 }
868875
869- * ppSidUser = pTokenUser -> User . Sid ;
876+ /* Memory in *ppTokenUser is LocalFree():d by the caller */
870877 return TRUE;
871878}
872879
0 commit comments