From cc28a275cb5096776a891f5b4d99ec03e18b8940 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 28 Aug 2004 21:00:35 +0000 Subject: [PATCH] Use dynamic buffer for token buffer in win32 admin check Magnus Hagander --- src/backend/port/win32/security.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/backend/port/win32/security.c b/src/backend/port/win32/security.c index acc2f41343..9a7727b34e 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; -- 2.40.0