diff --git a/src/backend/port/win32/security.c b/src/backend/port/win32/security.c
index acc2f41343cff49deb7bb3b613812276a29db6e4..9a7727b34e0d20b776cd80d22fda4a38deb60ba9 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;