aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2004-08-28 21:00:35 +0000
committerBruce Momjian <bruce@momjian.us>2004-08-28 21:00:35 +0000
commitcc28a275cb5096776a891f5b4d99ec03e18b8940 (patch)
treedb58880536e6f0f673e626bdf187c1d9e36e3fb4 /src
parent1c72d0dec1d9e087ddf4010fac098153677bf77d (diff)
downloadpostgresql-cc28a275cb5096776a891f5b4d99ec03e18b8940.tar.gz
postgresql-cc28a275cb5096776a891f5b4d99ec03e18b8940.zip
Use dynamic buffer for token buffer in win32 admin check
Magnus Hagander
Diffstat (limited to 'src')
-rw-r--r--src/backend/port/win32/security.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/backend/port/win32/security.c b/src/backend/port/win32/security.c
index acc2f41343c..9a7727b34e0 100644
--- a/src/backend/port/win32/security.c
+++ b/src/backend/port/win32/security.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/port/win32/security.c,v 1.1 2004/06/24 21:02:42 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/port/win32/security.c,v 1.2 2004/08/28 21:00:35 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -25,8 +25,8 @@ int
pgwin32_is_admin(void)
{
HANDLE AccessToken;
- UCHAR InfoBuffer[1024];
- PTOKEN_GROUPS Groups = (PTOKEN_GROUPS)InfoBuffer;
+ char *InfoBuffer = NULL;
+ PTOKEN_GROUPS Groups;
DWORD InfoBufferSize;
PSID AdministratorsSid;
PSID PowerUsersSid;
@@ -41,8 +41,30 @@ pgwin32_is_admin(void)
exit(1);
}
+ if (GetTokenInformation(AccessToken,TokenGroups,NULL,0,&InfoBufferSize))
+ {
+ write_stderr("failed to get token information - got zero size!\n");
+ exit(1);
+ }
+
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ write_stderr("failed to get token information: %d\n",
+ (int)GetLastError());
+ exit(1);
+ }
+
+ InfoBuffer = malloc(InfoBufferSize);
+ if (!InfoBuffer)
+ {
+ write_stderr("failed to allocate %i bytes for token information!\n",
+ (int)InfoBufferSize);
+ exit(1);
+ }
+ Groups = (PTOKEN_GROUPS)InfoBuffer;
+
if (!GetTokenInformation(AccessToken,TokenGroups,InfoBuffer,
- 1024, &InfoBufferSize))
+ InfoBufferSize, &InfoBufferSize))
{
write_stderr("failed to get token information: %d\n",
(int)GetLastError());
@@ -81,6 +103,7 @@ pgwin32_is_admin(void)
}
}
+ free(InfoBuffer);
FreeSid(AdministratorsSid);
FreeSid(PowerUsersSid);
return success;