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 intresolve_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)
697697DWORD dwTokenInfoLength = 0 ;
698698HANDLE hToken = NULL ;
699699PACL pacl = NULL ;
700- PSID psidUser = NULL ;
700+ PTOKEN_USER pTokenUser = NULL ;
701701TOKEN_DEFAULT_DACL tddNew ;
702702TOKEN_DEFAULT_DACL * ptdd = NULL ;
703703TOKEN_INFORMATION_CLASS tic = TokenDefaultDacl ;
@@ -744,15 +744,19 @@ AddUserToDacl(HANDLE hProcess)
744744gotocleanup ;
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 userSID : %lu" ,GetLastError ());
753+ log_error ("could not get usertoken : %lu" ,GetLastError ());
751754gotocleanup ;
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 */
758762pacl = (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{
790794log_error ("could not add access allowed ACE: %lu" ,GetLastError ());
791795gotocleanup ;
@@ -803,8 +807,8 @@ AddUserToDacl(HANDLE hProcess)
803807ret = TRUE;
804808
805809cleanup :
806- if (psidUser )
807- FreeSid ( psidUser );
810+ if (pTokenUser )
811+ LocalFree (( HLOCAL ) pTokenUser );
808812
809813if (pacl )
810814LocalFree ((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{
829836DWORD dwLength ;
830- PTOKEN_USER pTokenUser = NULL ;
831837
838+ * ppTokenUser = NULL ;
832839
833840if (!GetTokenInformation (hToken ,
834841TokenUser ,
835- pTokenUser ,
842+ NULL ,
8368430 ,
837844& dwLength ))
838845{
839846if (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{
845852log_error ("could not allocate %lu bytes of memory" ,dwLength );
846853return FALSE;
@@ -855,18 +862,18 @@ GetUserSid(PSID *ppSidUser, HANDLE hToken)
855862
856863if (!GetTokenInformation (hToken ,
857864TokenUser ,
858- pTokenUser ,
865+ * ppTokenUser ,
859866dwLength ,
860867& dwLength ))
861868{
862- HeapFree ( GetProcessHeap (), 0 , pTokenUser );
863- pTokenUser = NULL ;
869+ LocalFree ( * ppTokenUser );
870+ * ppTokenUser = NULL ;
864871
865872log_error ("could not get token information: %lu" ,GetLastError ());
866873return FALSE;
867874}
868875
869- * ppSidUser = pTokenUser -> User . Sid ;
876+ /* Memory in *ppTokenUser is LocalFree():d by the caller */
870877return TRUE;
871878}
872879