2003-09-09 Pierre Humblet <pierre.humblet@ieee.org>
* shared_info.h: Include security.h. (open_shared): Add psa argument. (user_shared_initialize): New declaration. * security.h: Add _SECURITY_H guard. (sec_user): Use sec_none in the no ntsec case. * spawn.cc (spawn_guts): Remove call to load_registry_hive. * syscalls (seteuid32): If warranted, call load_registry_hive, user_shared_initialize and RegCloseKey(HKEY_CURRENT_USER). * shared.cc (user_shared_initialize): New. (open_shared): Add and use psa argument. (memory_init): Move mount table initialization to user_shared_initialize. Call it.
This commit is contained in:
@@ -67,7 +67,8 @@ static char *offsets[] =
|
||||
};
|
||||
|
||||
void * __stdcall
|
||||
open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locations m)
|
||||
open_shared (const char *name, int n, HANDLE &shared_h, DWORD size,
|
||||
shared_locations m, PSECURITY_ATTRIBUTES psa)
|
||||
{
|
||||
void *shared;
|
||||
|
||||
@@ -96,7 +97,7 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat
|
||||
TRUE, mapname);
|
||||
}
|
||||
if (!shared_h &&
|
||||
!(shared_h = CreateFileMapping (INVALID_HANDLE_VALUE, &sec_all,
|
||||
!(shared_h = CreateFileMapping (INVALID_HANDLE_VALUE, psa,
|
||||
PAGE_READWRITE, 0, size, mapname)))
|
||||
api_fatal ("CreateFileMapping, %E. Terminating.");
|
||||
}
|
||||
@@ -144,6 +145,71 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat
|
||||
return shared;
|
||||
}
|
||||
|
||||
void
|
||||
user_shared_initialize ()
|
||||
{
|
||||
char name[UNLEN + 1] = "";
|
||||
|
||||
/* Temporary code. Will be cleaned up later */
|
||||
if (wincap.has_security ())
|
||||
{
|
||||
HANDLE ptok = NULL;
|
||||
DWORD siz;
|
||||
cygsid tu;
|
||||
|
||||
if (cygwin_mount_h) /* Reinit */
|
||||
tu = cygheap->user.sid ();
|
||||
else
|
||||
{
|
||||
if (!OpenProcessToken (hMainProc, TOKEN_ADJUST_DEFAULT | TOKEN_QUERY,
|
||||
&ptok))
|
||||
system_printf ("OpenProcessToken(): %E");
|
||||
else if (!GetTokenInformation (ptok, TokenUser, &tu, sizeof tu, &siz))
|
||||
system_printf ("GetTokenInformation (TokenUser): %E");
|
||||
else
|
||||
tu.string (name);
|
||||
if (ptok)
|
||||
CloseHandle (ptok);
|
||||
}
|
||||
tu.string (name);
|
||||
}
|
||||
else
|
||||
strcpy (name, cygheap->user.name ());
|
||||
|
||||
if (cygwin_mount_h)
|
||||
{
|
||||
if (!UnmapViewOfFile (mount_table))
|
||||
debug_printf("UnmapViewOfFile %E");
|
||||
if (!ForceCloseHandle (cygwin_mount_h))
|
||||
debug_printf("CloseHandle %E");
|
||||
cygwin_mount_h = NULL;
|
||||
}
|
||||
|
||||
mount_table = (mount_info *) open_shared (name, MOUNT_VERSION,
|
||||
cygwin_mount_h, sizeof (mount_info),
|
||||
SH_MOUNT_TABLE, &sec_none);
|
||||
debug_printf ("opening mount table for '%s' at %p", name,
|
||||
mount_table);
|
||||
ProtectHandleINH (cygwin_mount_h);
|
||||
debug_printf ("mount table version %x at %p", mount_table->version, mount_table);
|
||||
|
||||
/* Initialize the Cygwin per-user mount table, if necessary */
|
||||
if (!mount_table->version)
|
||||
{
|
||||
mount_table->version = MOUNT_VERSION_MAGIC;
|
||||
debug_printf ("initializing mount table");
|
||||
mount_table->cb = sizeof (*mount_table);
|
||||
if (mount_table->cb != MOUNT_INFO_CB)
|
||||
system_printf ("size of mount table region changed from %u to %u",
|
||||
MOUNT_INFO_CB, mount_table->cb);
|
||||
mount_table->init (); /* Initialize the mount table. */
|
||||
}
|
||||
else if (mount_table->version != MOUNT_VERSION_MAGIC)
|
||||
multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION);
|
||||
else if (mount_table->cb != MOUNT_INFO_CB)
|
||||
multiple_cygwin_problem ("mount table size", mount_table->cb, MOUNT_INFO_CB);
|
||||
}
|
||||
|
||||
void
|
||||
shared_info::initialize (const char *user_name)
|
||||
{
|
||||
@@ -208,31 +274,7 @@ memory_init ()
|
||||
cygheap->shared_h = shared_h;
|
||||
ProtectHandleINH (cygheap->shared_h);
|
||||
|
||||
/* Allocate memory for the per-user mount table */
|
||||
mount_table = (mount_info *) open_shared (user_name, MOUNT_VERSION,
|
||||
cygwin_mount_h, sizeof (mount_info),
|
||||
SH_MOUNT_TABLE);
|
||||
debug_printf ("opening mount table for '%s' at %p", cygheap->user.name (),
|
||||
mount_table);
|
||||
ProtectHandleINH (cygwin_mount_h);
|
||||
debug_printf ("mount table version %x at %p", mount_table->version, mount_table);
|
||||
|
||||
/* Initialize the Cygwin per-user mount table, if necessary */
|
||||
if (!mount_table->version)
|
||||
{
|
||||
mount_table->version = MOUNT_VERSION_MAGIC;
|
||||
debug_printf ("initializing mount table");
|
||||
mount_table->cb = sizeof (*mount_table);
|
||||
if (mount_table->cb != MOUNT_INFO_CB)
|
||||
system_printf ("size of mount table region changed from %u to %u",
|
||||
MOUNT_INFO_CB, mount_table->cb);
|
||||
mount_table->init (); /* Initialize the mount table. */
|
||||
}
|
||||
else if (mount_table->version != MOUNT_VERSION_MAGIC)
|
||||
multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION);
|
||||
else if (mount_table->cb != MOUNT_INFO_CB)
|
||||
multiple_cygwin_problem ("mount table size", mount_table->cb, MOUNT_INFO_CB);
|
||||
|
||||
user_shared_initialize ();
|
||||
}
|
||||
|
||||
unsigned
|
||||
|
Reference in New Issue
Block a user