* Portions Copyright (c) 1994, Regents of the University of California
* Portions taken from FreeBSD.
*
- * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.125.2.4 2009/11/15 09:08:45 mha Exp $
+ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.125.2.5 2009/11/20 01:28:18 mha Exp $
*
*-------------------------------------------------------------------------
*/
return 0;
}
-#ifndef __CYGWIN__
- AddUserToTokenDacl(restrictedToken);
-#endif
-
if (!CreateProcessAsUser(restrictedToken,
NULL,
cmd,
return 0;
}
+#ifndef __CYGWIN__
+ AddUserToDacl(processInfo->hProcess);
+#endif
+
return ResumeThread(processInfo->hThread);
}
#endif
*
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.74.2.8 2009/11/15 09:08:46 mha Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.74.2.9 2009/11/20 01:28:18 mha Exp $
*
*-------------------------------------------------------------------------
*/
return 0;
}
-#ifndef __CYGWIN__
- AddUserToTokenDacl(restrictedToken);
-#endif
-
r = CreateProcessAsUser(restrictedToken, NULL, cmd, NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, NULL, &si, processInfo);
Kernel32Handle = LoadLibrary("KERNEL32.DLL");
}
}
+#ifndef __CYGWIN__
+ AddUserToDacl(processInfo->hProcess);
+#endif
+
CloseHandle(restrictedToken);
ResumeThread(processInfo->hThread);
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/port.h,v 1.106.2.7 2009/11/15 09:08:46 mha Exp $
+ * $PostgreSQL: pgsql/src/include/port.h,v 1.106.2.8 2009/11/20 01:28:17 mha Exp $
*
*-------------------------------------------------------------------------
*/
/* Windows security token manipulation (in exec.c) */
#ifdef WIN32
-extern BOOL AddUserToTokenDacl(HANDLE hToken);
+extern BOOL AddUserToDacl(HANDLE hProcess);
#endif
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/port/exec.c,v 1.43.2.3 2009/11/15 09:08:46 mha Exp $
+ * $PostgreSQL: pgsql/src/port/exec.c,v 1.43.2.4 2009/11/20 01:28:18 mha Exp $
*
*-------------------------------------------------------------------------
*/
#ifdef WIN32
/*
- * AddUserToTokenDacl(HANDLE hToken)
+ * AddUserToDacl(HANDLE hProcess)
*
- * This function adds the current user account to the restricted
- * token used when we create a restricted process.
+ * This function adds the current user account to the default DACL
+ * which gets attached to the restricted token used when we create
+ * a restricted process.
*
* This is required because of some security changes in Windows
* that appeared in patches to XP/2K3 and in Vista/2008.
* and CreateProcess() calls when running as Administrator.
*
* This function fixes this problem by modifying the DACL of the
- * token the process will use, and explicitly re-adding the current
- * user account. This is still secure because the Administrator account
- * inherits its privileges from the Administrators group - it doesn't
- * have any of its own.
+ * specified process and explicitly re-adding the current user account.
+ * This is still secure because the Administrator account inherits it's
+ * privileges from the Administrators group - it doesn't have any of
+ * it's own.
*/
BOOL
-AddUserToTokenDacl(HANDLE hToken)
+AddUserToDacl(HANDLE hProcess)
{
int i;
ACL_SIZE_INFORMATION asi;
DWORD dwSize = 0;
DWORD dwTokenInfoLength = 0;
DWORD dwResult = 0;
+ HANDLE hToken = NULL;
PACL pacl = NULL;
PSID psidUser = NULL;
TOKEN_DEFAULT_DACL tddNew;
TOKEN_INFORMATION_CLASS tic = TokenDefaultDacl;
BOOL ret = FALSE;
+ /* Get the token for the process */
+ if (!OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_ADJUST_DEFAULT, &hToken))
+ {
+ log_error("could not open process token: %ui", GetLastError());
+ goto cleanup;
+ }
+
/* Figure out the buffer size for the DACL info */
if (!GetTokenInformation(hToken, tic, (LPVOID) NULL, dwTokenInfoLength, &dwSize))
{
}
/* Add the new ACE for the current user */
- if (!AddAccessAllowedAceEx(pacl, ACL_REVISION, OBJECT_INHERIT_ACE, GENERIC_ALL, psidUser))
+ if (!AddAccessAllowedAce(pacl, ACL_REVISION, GENERIC_ALL, psidUser))
{
log_error("could not add access allowed ACE: %ui", GetLastError());
goto cleanup;
if (ptdd)
LocalFree((HLOCAL) ptdd);
+ if (hToken)
+ CloseHandle(hToken);
+
return ret;
}