Index: src/backend/libpq/auth.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/libpq/auth.c,v retrieving revision 1.154 diff -c -r1.154 auth.c *** src/backend/libpq/auth.c 23 Jul 2007 10:16:53 -0000 1.154 --- src/backend/libpq/auth.c 23 Jul 2007 12:52:01 -0000 *************** *** 567,572 **** --- 567,575 ---- errdetail("%s (%x)", sysmsg, r))); } + typedef SECURITY_STATUS + (SEC_ENTRY * QUERY_SECURITY_CONTEXT_TOKEN_FN)( + PCtxtHandle, void SEC_FAR * SEC_FAR *); static int pg_SSPI_recvauth(Port *port) *************** *** 591,596 **** --- 594,601 ---- DWORD accountnamesize = sizeof(accountname); DWORD domainnamesize = sizeof(domainname); SID_NAME_USE accountnameuse; + HMODULE secur32; + QUERY_SECURITY_CONTEXT_TOKEN_FN _QuerySecurityContextToken; /* *************** *** 728,737 **** * pg username that was specified for the connection. */ ! r = QuerySecurityContextToken(sspictx, &token); if (r != SEC_E_OK) pg_SSPI_error(ERROR, gettext_noop("could not get security token from context"), r); /* * No longer need the security context, everything from here on uses the --- 733,763 ---- * pg username that was specified for the connection. */ ! secur32 = LoadLibrary("SECUR32.DLL"); ! if (secur32 == NULL) ! ereport(ERROR, ! (errmsg_internal("could not load secur32.dll: %d", ! (int)GetLastError()))); ! ! _QuerySecurityContextToken = (QUERY_SECURITY_CONTEXT_TOKEN_FN) ! GetProcAddress(secur32, "QuerySecurityContextToken"); ! if (_QuerySecurityContextToken == NULL) ! { ! FreeLibrary(secur32); ! ereport(ERROR, ! (errmsg_internal("could not locate QuerySecurityContextToken in secur32.dll: %d", ! (int)GetLastError()))); ! } ! ! r = (_QuerySecurityContextToken)(sspictx, &token); if (r != SEC_E_OK) + { + FreeLibrary(secur32); pg_SSPI_error(ERROR, gettext_noop("could not get security token from context"), r); + } + + FreeLibrary(secur32); /* * No longer need the security context, everything from here on uses the