Re: initdb failed on Windows 2000 - Mailing list pgsql-hackers

From Yoshiyuki Asaba
Subject Re: initdb failed on Windows 2000
Date
Msg-id 20070829.163806.220052165.y-asaba@sraoss.co.jp
Whole thread Raw
In response to initdb failed on Windows 2000  (Yoshiyuki Asaba <y-asaba@sraoss.co.jp>)
Responses Re: initdb failed on Windows 2000  (Andrew Dunstan <andrew@dunslane.net>)
List pgsql-hackers
Hi,

From: Yoshiyuki Asaba <y-asaba@sraoss.co.jp>
Subject: [HACKERS] initdb failed on Windows 2000
Date: Mon, 27 Aug 2007 20:46:35 +0900 (JST)

> I have compiled PostgreSQL 8.2.4 with MinGW on Windows 2000. Then I
> have executed initdb as Administrator. However initdb failed with the
> following message.
> 
> ----
> The program "postgres" is needed by initdb but was not found in the
> same directory as "C:\msys\1.0\local\pgsql\bin/initdb".
> Check your installation.
> ----
> 
> So, I have debugged initdb.exe. I found that CreatePipe() was failed
> with ERROR_ACCESS_DENIED in exec.c:pipe_read_line().

The attached files are test programs.
 % gcc -o child.exe child.c % gcc -o parent.exe parent.c

When parent.exe is executed by Power Users or Users, the result is
good. However, CreatePipe() is failed when Administrator do.
 % ./parent.exe CreatePipe() failed: 5

Regards,
--
Yoshiyuki Asaba
y-asaba@sraoss.co.jp
#include <stdio.h>
#include <windows.h>

typedef        BOOL(WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD,
PLUID_AND_ATTRIBUTES,DWORD, PSID_AND_ATTRIBUTES, PHANDLE);
 

#define DISABLE_MAX_PRIVILEGE    0x1

/** Create a restricted token and execute the specified process with it.** Returns 0 on failure, non-zero on success,
sameas CreateProcess().** On NT4, or any other system not containing the required functions, will* NOT execute
anything.*/
static int
CreateRestrictedProcess(char *cmd)
{BOOL        b;STARTUPINFO si;HANDLE        origToken;HANDLE        restrictedToken;SID_IDENTIFIER_AUTHORITY
NtAuthority= {SECURITY_NT_AUTHORITY};SID_AND_ATTRIBUTES dropSids[2];__CreateRestrictedToken _CreateRestrictedToken =
NULL;HANDLE       Advapi32Handle;PROCESS_INFORMATION pi;
 
ZeroMemory(&pi, sizeof(pi));ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);
Advapi32Handle = LoadLibrary("ADVAPI32.DLL");if (Advapi32Handle != NULL){    _CreateRestrictedToken =
(__CreateRestrictedToken)GetProcAddress(Advapi32Handle, "CreateRestrictedToken");}
 
if (_CreateRestrictedToken == NULL){    fprintf(stderr, "WARNING: Unable to create restricted tokens on this
platform\n");   if (Advapi32Handle != NULL)        FreeLibrary(Advapi32Handle);    return 0;}
 
/* Open the current token to use as a base for the restricted one */if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ALL_ACCESS,&origToken)){    fprintf(stderr, "Failed to open process token: %lu\n", GetLastError());    return
0;}
/* Allocate list of SIDs to remove */ZeroMemory(&dropSids, sizeof(dropSids));if
(!AllocateAndInitializeSid(&NtAuthority,2,     SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0,
                        0, &dropSids[0].Sid) ||    !AllocateAndInitializeSid(&NtAuthority,
2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_POWER_USERS, 0, 0, 0, 0, 0,                              0,
&dropSids[1].Sid)){   fprintf(stderr, "Failed to allocate SIDs: %lu\n", GetLastError());    return 0;}
 
b = _CreateRestrictedToken(origToken,                           DISABLE_MAX_PRIVILEGE,
sizeof(dropSids)/ sizeof(dropSids[0]),                           dropSids,                           0, NULL,
               0, NULL,                           &restrictedToken);
 
FreeSid(dropSids[1].Sid);FreeSid(dropSids[0].Sid);CloseHandle(origToken);FreeLibrary(Advapi32Handle);
if (!b){    fprintf(stderr, "Failed to create restricted token: %lu\n", GetLastError());    return 0;}
       CreateProcessAsUser(restrictedToken, NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess,INFINITE);CloseHandle(pi.hThread);CloseHandle(pi.hProcess);return 0;
 
}

int main(void)
{CreateRestrictedProcess("child.exe");return 0;
}
#include <stdio.h>
#include <windows.h>

int main(void)
{     SECURITY_ATTRIBUTES sattr;HANDLE        childstdoutrd,            childstdoutwr,            childstdoutrddup,
file,pipe;PROCESS_INFORMATION pi;STARTUPINFO si;
 
     sattr.nLength = sizeof(SECURITY_ATTRIBUTES);sattr.bInheritHandle = TRUE;sattr.lpSecurityDescriptor = NULL;
SetLastError(0);     if (!CreatePipe(&childstdoutrd, &childstdoutwr, &sattr, 0))           printf("CreatePipe() failed:
%lu\n",GetLastError());       else    puts("ok");
 
CloseHandle(childstdoutrd);     CloseHandle(childstdoutwr);
return 0;
}

pgsql-hackers by date:

Previous
From: Florian Weimer
Date:
Subject: Re: [GENERAL] Undetected corruption of table files
Next
From: "Nikolay Samokhvalov"
Date:
Subject: Re: Contrib modules documentation online