Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-04-03 17:06:43 +0400
committerCorinna Vinschen <corinna@vinschen.de>2005-04-03 17:06:43 +0400
commitf4a1f8a1dbc28b1f0330ebb19ed3eef2ea0618b2 (patch)
tree8170a7d08115c82afaf666a110e57f322329c505 /winsup/cygwin/cygheap.h
parentfe3e3336611e938e9d97be5cbce677d0be5a6fc9 (diff)
* cygheap.cc (cygheap_init): Accomodate set_process_privilege change.
* cygheap.h (cygheap_user::curr_primary_token): New member. (cygheap_user::primary_token): New method. (cygheap_user::deimpersonate): Always revert to processes' impersonation token. (cygheap_user::reimpersonate): Set processes' or setuid token as necessary. (cygheap_user::has_impersonation_tokens): Look for curr_primary_token value. (cygheap_user::close_impersonation_tokens): Close curr_primary_token here if necessary. Don't reset token values to NO_IMPERSONATION since that's done in uinfo_init anyway. (init_cygheap::luid): New LUID array keeping privilege LUIDs. * cygtls.cc (_cygtls::init_thread): Call cygheap->user.reimpersonate. * dcrt0.cc (hProcToken): New global variable to keep process token. (hProcImpToken): Ditto for process impersonation token. (dll_crt0_0): Open process token here once. Duplicate to create hProcImpToken. (dll_crt0_1): Call set_cygwin_privileges. * environ.cc (allow_ntea): Drop duplicate declaration. (allow_smbntsec): Ditto. (set_traverse): Only set allow_traverse here. (environ_init): Ditto. * fhandler_disk_file.cc (fhandler_disk_file::fchmod): Drop call to enable_restore_privilege. (fhandler_disk_file::fchown): Ditto. (fhandler_disk_file::facl): Ditto. * fork.cc (fork_child): Move call to cygheap->user.reimpersonate after syn with parent. Call set_cygwin_privileges. * grp.cc (internal_getgroups): Use hProcImpToken instead of opening process token. * path.cc (fs_info::update): Bypass traverse checking when retrieving volume information using push/pop_thread_privileges. * registry.cc (load_registry_hive): Drop setting restore privilege since it's already set if available. * sec_helper.cc: Include cygtls.h. (cygpriv): Privilege string array. (privilege_luid): New function, evaluate LUID from cygpriv_idx. (privilege_luid_by_name): New function, evaluate LUID from privilege string. (privilege_name): New function, evaluate privilege string from cygpriv_idx. (set_privilege): New static function called by set_process_privilege and set_thread_privilege. Call privilege_luid to get privilege LUID. Fix bug in return value evaluation. Improve debug output. (set_cygwin_privileges): New function. (set_process_privilege): Remove. (enable_restore_privilege): Remove. * security.cc (allow_traverse): New global variable. (sys_privs): Change type to cygpriv_idx and store privilege indices instead of strings. (SYSTEM_PRIVILEGES_COUNT): Renamed from SYSTEM_PERMISSION_COUNT. (get_system_priv_list): Don't use numerical constant in malloc call. Use privilege_luid to get privilege LUIDs. (get_priv_list): Call privilege_luid_by_name to get LUIDs. Improve inner privilege LUID comparison loop. (create_token): Enable create token privilege using push/pop_self_privileges. Use hProcToken instead of opening process token. Use default DACL when duplicating token. (subauth): Enable tcb privilege using push/pop_self_privileges. Use sec_none instead of homw made security attributes when duplicating token. (check_file_access): Don't duplicate access token, use active impersonation token as is. * security.h (enum cygpriv_idx): New enumeration type enumerating possible privileges. (privilege_luid): Declare new function. (privilege_luid_by_name): Ditto. (privilege_name): Ditto. (allow_traverse): Declare. (set_privilege): Declare function. (set_process_privilege): Define as macro. (enable_restore_privilege): Remove declaration. (_push_thread_privilege): Define macro. (push_thread_privilege): Ditto. (pop_thread_privilege): Ditto. (pop_self_privilege): Ditto. * spawn.cc (spawn_guts): Use cygheap->user.primary_token instead of cygheap->user.token. * syscalls.cc (statvfs): Bypass traverse checking when retrieving volume information using push/pop_thread_privileges. Rearrange code to simplify push/pop bracketing. (seteuid32): Use hProcToken instead of opening process token. Call cygheap->user.deimpersonate instead of RevertToSelf. Create impersonation token from primary internal or external token. Set cygheap->user.curr_primary_token and cygheap->user.current_token privileges once here. Drop "failed" and "failed_ptok" labels. Drop setting DefaultDacl of process token. (setegid32): Use hProcToken and hProcImpToken instead of opening process token. Always reimpersonate afterwards. * uinfo.cc (cygheap_user::init): Use hProcToken instead of opening process token. (internal_getlogin): Ditto. Set hProcImpToken, too. (uinfo_init): Initialize cygheap->user.curr_primary_token. * winsup.h (hProcToken): Declare. (hProcImpToken): Declare.
Diffstat (limited to 'winsup/cygwin/cygheap.h')
-rw-r--r--winsup/cygwin/cygheap.h36
1 files changed, 17 insertions, 19 deletions
diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h
index a338c6ed7..3679ddb56 100644
--- a/winsup/cygwin/cygheap.h
+++ b/winsup/cygwin/cygheap.h
@@ -123,6 +123,7 @@ public:
to `set_impersonation_token()'. */
HANDLE external_token;
HANDLE internal_token;
+ HANDLE curr_primary_token;
HANDLE current_token;
/* CGF 2002-06-27. I removed the initializaton from this constructor
@@ -172,40 +173,36 @@ public:
const char *ontherange (homebodies what, struct passwd * = NULL);
#define NO_IMPERSONATION NULL
bool issetuid () const { return current_token != NO_IMPERSONATION; }
+ HANDLE primary_token () { return curr_primary_token; }
HANDLE token () { return current_token; }
void deimpersonate ()
{
if (issetuid ())
- RevertToSelf ();
+ {
+ RevertToSelf ();
+ ImpersonateLoggedOnUser (hProcImpToken);
+ }
}
- void reimpersonate ()
+ bool reimpersonate ()
{
- if (issetuid ()
- && !ImpersonateLoggedOnUser (token ()))
- system_printf ("ImpersonateLoggedOnUser: %E");
+ return ImpersonateLoggedOnUser (issetuid () ? token () : hProcImpToken);
}
bool has_impersonation_tokens ()
{ return external_token != NO_IMPERSONATION
|| internal_token != NO_IMPERSONATION
- || current_token != NO_IMPERSONATION; }
+ || curr_primary_token != NO_IMPERSONATION; }
void close_impersonation_tokens ()
{
if (current_token != NO_IMPERSONATION)
- {
- if( current_token != external_token && current_token != internal_token)
- CloseHandle (current_token);
- current_token = NO_IMPERSONATION;
- }
+ CloseHandle (current_token);
+ if (curr_primary_token != NO_IMPERSONATION
+ && curr_primary_token != external_token
+ && curr_primary_token != internal_token)
+ CloseHandle (curr_primary_token);
if (external_token != NO_IMPERSONATION)
- {
- CloseHandle (external_token);
- external_token = NO_IMPERSONATION;
- }
+ CloseHandle (external_token);
if (internal_token != NO_IMPERSONATION)
- {
- CloseHandle (internal_token);
- internal_token = NO_IMPERSONATION;
- }
+ CloseHandle (internal_token);
}
char * get_windows_id (char * buf)
{
@@ -284,6 +281,7 @@ struct init_cygheap
char *cygwin_regname;
cwdstuff cwd;
dtable fdtab;
+ LUID luid[SE_NUM_PRIVS];
const char *shared_prefix;
#ifdef DEBUGGING
cygheap_debug debug;