2003-09-24 Pierre Humblet <pierre.humblet@ieee.org>
* shared_info.h (class user_info): New. (cygwin_user_h): New. (user_shared): New. (enum shared_locations): Replace SH_MOUNT_TABLE by SH_USER_SHARED; (mount_table): Change from variable to macro. * shared.cc: Use sizeof(user_info) in "offsets". (user_shared_initialize): Add "reinit" argument to indicate need to reinitialize the mapping. Replace "mount_table" by "user_shared" throughout. Call user_shared->mountinfo.init and user_shared->delqueue.init. (shared_info::initialize): Do not call delqueue.init. (memory_init): Add argument to user_shared_initialize. * child_info.h (child_info::mount_h): Delete. (child_info::user_h): New. * sigpproc.cc (init_child_info): Use user_h instead of mount_h. * dcrt0.cc (_dll_crt0): Ditto. * fhandler_disk_file.cc (fhandler_disk_file::close): Use user_shared->delqueue instead of cygwin_shared->delqueue. * fhandler_virtual.cc (fhandler_virtual::close): Ditto. * syscalls.cc (close_all_files): Ditto. (unlink): Ditto. (seteuid32): Add argument to user_shared_initialize.
This commit is contained in:
parent
a4e167fa27
commit
138847683d
|
@ -44,7 +44,7 @@ public:
|
||||||
unsigned short type; // type of record, exec, spawn, fork
|
unsigned short type; // type of record, exec, spawn, fork
|
||||||
int cygpid; // cygwin pid of child process
|
int cygpid; // cygwin pid of child process
|
||||||
HANDLE subproc_ready; // used for synchronization with parent
|
HANDLE subproc_ready; // used for synchronization with parent
|
||||||
HANDLE mount_h;
|
HANDLE user_h;
|
||||||
HANDLE parent;
|
HANDLE parent;
|
||||||
HANDLE pppid_handle;
|
HANDLE pppid_handle;
|
||||||
init_cygheap *cygheap;
|
init_cygheap *cygheap;
|
||||||
|
|
|
@ -901,7 +901,7 @@ _dll_crt0 ()
|
||||||
multiple_cygwin_problem ("fhandler size", child_proc_info->fhandler_union_cb, sizeof (fhandler_union));
|
multiple_cygwin_problem ("fhandler size", child_proc_info->fhandler_union_cb, sizeof (fhandler_union));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cygwin_mount_h = child_proc_info->mount_h;
|
cygwin_user_h = child_proc_info->user_h;
|
||||||
mypid = child_proc_info->cygpid;
|
mypid = child_proc_info->cygpid;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -446,7 +446,7 @@ fhandler_base::close_fs ()
|
||||||
{
|
{
|
||||||
int res = fhandler_base::close ();
|
int res = fhandler_base::close ();
|
||||||
if (!res)
|
if (!res)
|
||||||
cygwin_shared->delqueue.process_queue ();
|
user_shared->delqueue.process_queue ();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -167,7 +167,7 @@ fhandler_virtual::close ()
|
||||||
free (filebuf);
|
free (filebuf);
|
||||||
filebuf = NULL;
|
filebuf = NULL;
|
||||||
bufalloc = (size_t) -1;
|
bufalloc = (size_t) -1;
|
||||||
cygwin_shared->delqueue.process_queue ();
|
user_shared->delqueue.process_queue ();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,8 @@ details. */
|
||||||
#include "child_info.h"
|
#include "child_info.h"
|
||||||
|
|
||||||
shared_info NO_COPY *cygwin_shared;
|
shared_info NO_COPY *cygwin_shared;
|
||||||
mount_info NO_COPY *mount_table;
|
user_info NO_COPY *user_shared;
|
||||||
HANDLE NO_COPY cygwin_mount_h;
|
HANDLE NO_COPY cygwin_user_h;
|
||||||
|
|
||||||
char * __stdcall
|
char * __stdcall
|
||||||
shared_name (char *ret_buf, const char *str, int num)
|
shared_name (char *ret_buf, const char *str, int num)
|
||||||
|
@ -54,14 +54,14 @@ static char *offsets[] =
|
||||||
+ pround (sizeof (shared_info)),
|
+ pround (sizeof (shared_info)),
|
||||||
(char *) cygwin_shared_address
|
(char *) cygwin_shared_address
|
||||||
+ pround (sizeof (shared_info))
|
+ pround (sizeof (shared_info))
|
||||||
+ pround (sizeof (mount_info)),
|
+ pround (sizeof (user_info)),
|
||||||
(char *) cygwin_shared_address
|
(char *) cygwin_shared_address
|
||||||
+ pround (sizeof (shared_info))
|
+ pround (sizeof (shared_info))
|
||||||
+ pround (sizeof (mount_info))
|
+ pround (sizeof (user_info))
|
||||||
+ pround (sizeof (console_state)),
|
+ pround (sizeof (console_state)),
|
||||||
(char *) cygwin_shared_address
|
(char *) cygwin_shared_address
|
||||||
+ pround (sizeof (shared_info))
|
+ pround (sizeof (shared_info))
|
||||||
+ pround (sizeof (mount_info))
|
+ pround (sizeof (user_info))
|
||||||
+ pround (sizeof (console_state))
|
+ pround (sizeof (console_state))
|
||||||
+ pround (sizeof (_pinfo))
|
+ pround (sizeof (_pinfo))
|
||||||
};
|
};
|
||||||
|
@ -146,10 +146,21 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
user_shared_initialize ()
|
user_shared_initialize (bool reinit)
|
||||||
{
|
{
|
||||||
char name[UNLEN + 1] = "";
|
char name[UNLEN + 1] = ""; /* Large enough for SID */
|
||||||
|
|
||||||
|
if (reinit)
|
||||||
|
{
|
||||||
|
if (!UnmapViewOfFile (user_shared))
|
||||||
|
debug_printf("UnmapViewOfFile %E");
|
||||||
|
if (!ForceCloseHandle (cygwin_user_h))
|
||||||
|
debug_printf("CloseHandle %E");
|
||||||
|
cygwin_user_h = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cygwin_user_h)
|
||||||
|
{
|
||||||
if (wincap.has_security ())
|
if (wincap.has_security ())
|
||||||
{
|
{
|
||||||
cygsid tu (cygheap->user.sid ());
|
cygsid tu (cygheap->user.sid ());
|
||||||
|
@ -157,39 +168,32 @@ user_shared_initialize ()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
strcpy (name, cygheap->user.name ());
|
strcpy (name, cygheap->user.name ());
|
||||||
|
|
||||||
if (cygwin_mount_h) /* Reinit */
|
|
||||||
{
|
|
||||||
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,
|
user_shared = (user_info *) open_shared (name, USER_VERSION,
|
||||||
cygwin_mount_h, sizeof (mount_info),
|
cygwin_user_h, sizeof (user_info),
|
||||||
SH_MOUNT_TABLE, &sec_none);
|
SH_USER_SHARED, &sec_none);
|
||||||
debug_printf ("opening mount table for '%s' at %p", name,
|
debug_printf ("opening user shared for '%s' at %p", name, user_shared);
|
||||||
mount_table);
|
ProtectHandleINH (cygwin_user_h);
|
||||||
ProtectHandleINH (cygwin_mount_h);
|
debug_printf ("user shared version %x", user_shared->version);
|
||||||
debug_printf ("mount table version %x at %p", mount_table->version, mount_table);
|
|
||||||
|
|
||||||
/* Initialize the Cygwin per-user mount table, if necessary */
|
/* Initialize the Cygwin per-user shared, if necessary */
|
||||||
if (!mount_table->version)
|
if (!user_shared->version)
|
||||||
{
|
{
|
||||||
mount_table->version = MOUNT_VERSION_MAGIC;
|
user_shared->version = USER_VERSION_MAGIC;
|
||||||
debug_printf ("initializing mount table");
|
debug_printf ("initializing user shared");
|
||||||
mount_table->cb = sizeof (*mount_table);
|
user_shared->cb = sizeof (*user_shared);
|
||||||
if (mount_table->cb != MOUNT_INFO_CB)
|
if (user_shared->cb != sizeof (*user_shared))
|
||||||
system_printf ("size of mount table region changed from %u to %u",
|
system_printf ("size of user shared region changed from %u to %u",
|
||||||
MOUNT_INFO_CB, mount_table->cb);
|
sizeof (*user_shared), user_shared->cb);
|
||||||
mount_table->init (); /* Initialize the mount table. */
|
user_shared->mountinfo.init (); /* Initialize the mount table. */
|
||||||
|
/* Initialize the queue of deleted files. */
|
||||||
|
user_shared->delqueue.init ();
|
||||||
}
|
}
|
||||||
else if (mount_table->version != MOUNT_VERSION_MAGIC)
|
else if (user_shared->version != USER_VERSION_MAGIC)
|
||||||
multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION);
|
multiple_cygwin_problem ("user", user_shared->version, USER_VERSION_MAGIC);
|
||||||
else if (mount_table->cb != MOUNT_INFO_CB)
|
else if (user_shared->cb != sizeof (*user_shared))
|
||||||
multiple_cygwin_problem ("mount table size", mount_table->cb, MOUNT_INFO_CB);
|
multiple_cygwin_problem ("user shared size", user_shared->cb, sizeof (*user_shared));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -198,9 +202,6 @@ shared_info::initialize ()
|
||||||
DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &version, SHARED_VERSION_MAGIC);
|
DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &version, SHARED_VERSION_MAGIC);
|
||||||
if (!sversion)
|
if (!sversion)
|
||||||
{
|
{
|
||||||
/* Initialize the queue of deleted files. */
|
|
||||||
delqueue.init ();
|
|
||||||
|
|
||||||
/* Initialize tty table. */
|
/* Initialize tty table. */
|
||||||
tty.init ();
|
tty.init ();
|
||||||
}
|
}
|
||||||
|
@ -249,7 +250,7 @@ memory_init ()
|
||||||
cygheap->shared_h = shared_h;
|
cygheap->shared_h = shared_h;
|
||||||
ProtectHandleINH (cygheap->shared_h);
|
ProtectHandleINH (cygheap->shared_h);
|
||||||
|
|
||||||
user_shared_initialize ();
|
user_shared_initialize (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
|
|
|
@ -42,10 +42,9 @@ class mount_item
|
||||||
scheme should be satisfactory for a long while yet. */
|
scheme should be satisfactory for a long while yet. */
|
||||||
#define MAX_MOUNTS 30
|
#define MAX_MOUNTS 30
|
||||||
|
|
||||||
#define MOUNT_VERSION 27 // increment when mount table changes and
|
#define USER_VERSION 1 // increment when mount table changes and
|
||||||
#define MOUNT_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, MOUNT_VERSION)
|
#define USER_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, USER_VERSION)
|
||||||
#define CURR_MOUNT_MAGIC 0x6dd73a3fU
|
#define CURR_MOUNT_MAGIC 0x4fe431cdU /* FIXME */
|
||||||
#define MOUNT_INFO_CB 16488
|
|
||||||
|
|
||||||
class reg_key;
|
class reg_key;
|
||||||
struct device;
|
struct device;
|
||||||
|
@ -133,6 +132,14 @@ public:
|
||||||
void process_queue ();
|
void process_queue ();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class user_info
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DWORD version;
|
||||||
|
DWORD cb;
|
||||||
|
delqueue_list delqueue;
|
||||||
|
mount_info mountinfo;
|
||||||
|
};
|
||||||
/******** Shared Info ********/
|
/******** Shared Info ********/
|
||||||
/* Data accessible to all tasks */
|
/* Data accessible to all tasks */
|
||||||
|
|
||||||
|
@ -162,13 +169,14 @@ class shared_info
|
||||||
};
|
};
|
||||||
|
|
||||||
extern shared_info *cygwin_shared;
|
extern shared_info *cygwin_shared;
|
||||||
extern mount_info *mount_table;
|
extern user_info *user_shared;
|
||||||
extern HANDLE cygwin_mount_h;
|
#define mount_table (&(user_shared->mountinfo))
|
||||||
|
extern HANDLE cygwin_user_h;
|
||||||
|
|
||||||
enum shared_locations
|
enum shared_locations
|
||||||
{
|
{
|
||||||
SH_CYGWIN_SHARED,
|
SH_CYGWIN_SHARED,
|
||||||
SH_MOUNT_TABLE,
|
SH_USER_SHARED,
|
||||||
SH_SHARED_CONSOLE,
|
SH_SHARED_CONSOLE,
|
||||||
SH_MYSELF,
|
SH_MYSELF,
|
||||||
SH_TOTAL_SIZE
|
SH_TOTAL_SIZE
|
||||||
|
@ -193,5 +201,5 @@ struct console_state
|
||||||
char *__stdcall shared_name (char *, const char *, int);
|
char *__stdcall shared_name (char *, const char *, int);
|
||||||
void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size,
|
void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size,
|
||||||
shared_locations, PSECURITY_ATTRIBUTES psa = &sec_all);
|
shared_locations, PSECURITY_ATTRIBUTES psa = &sec_all);
|
||||||
extern void user_shared_initialize ();
|
extern void user_shared_initialize (bool reinit);
|
||||||
|
|
||||||
|
|
|
@ -833,7 +833,7 @@ init_child_info (DWORD chtype, child_info *ch, pid_t pid, HANDLE subproc_ready)
|
||||||
ch->subproc_ready = subproc_ready;
|
ch->subproc_ready = subproc_ready;
|
||||||
ch->pppid_handle = myself->ppid_handle;
|
ch->pppid_handle = myself->ppid_handle;
|
||||||
ch->fhandler_union_cb = sizeof (fhandler_union);
|
ch->fhandler_union_cb = sizeof (fhandler_union);
|
||||||
ch->mount_h = cygwin_mount_h;
|
ch->user_h = cygwin_user_h;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check the state of all of our children to see if any are stopped or
|
/* Check the state of all of our children to see if any are stopped or
|
||||||
|
|
|
@ -98,7 +98,7 @@ close_all_files (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "close_all_files");
|
ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "close_all_files");
|
||||||
cygwin_shared->delqueue.process_queue ();
|
user_shared->delqueue.process_queue ();
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -222,7 +222,7 @@ unlink (const char *ourname)
|
||||||
syscall_printf ("couldn't delete file, err %d", lasterr);
|
syscall_printf ("couldn't delete file, err %d", lasterr);
|
||||||
|
|
||||||
/* Add file to the "to be deleted" queue. */
|
/* Add file to the "to be deleted" queue. */
|
||||||
cygwin_shared->delqueue.queue_file (win32_name);
|
user_shared->delqueue.queue_file (win32_name);
|
||||||
|
|
||||||
/* Success condition. */
|
/* Success condition. */
|
||||||
ok:
|
ok:
|
||||||
|
@ -2214,7 +2214,7 @@ seteuid32 (__uid32_t uid)
|
||||||
RegCloseKey(HKEY_CURRENT_USER);
|
RegCloseKey(HKEY_CURRENT_USER);
|
||||||
cygheap->user.reimpersonate ();
|
cygheap->user.reimpersonate ();
|
||||||
if (!issamesid)
|
if (!issamesid)
|
||||||
user_shared_initialize ();
|
user_shared_initialize (true);
|
||||||
|
|
||||||
success_9x:
|
success_9x:
|
||||||
cygheap->user.set_name (pw_new->pw_name);
|
cygheap->user.set_name (pw_new->pw_name);
|
||||||
|
|
Loading…
Reference in New Issue