diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2000-11-15 00:13:09 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2000-11-15 00:13:09 +0000 |
commit | 1f0f8e127c6a6fd7520ebc08eb2f479507247d5f (patch) | |
tree | 8ae38247dfc47ad5ebfdc0b5f8c93d700179deb0 /winsup/cygwin/syscalls.cc | |
parent | fe8c097112ab4e2cd2c369b484561c0bd4ce4b75 (diff) | |
download | cygnal-1f0f8e127c6a6fd7520ebc08eb2f479507247d5f.tar.gz cygnal-1f0f8e127c6a6fd7520ebc08eb2f479507247d5f.tar.bz2 cygnal-1f0f8e127c6a6fd7520ebc08eb2f479507247d5f.zip |
* cygheap.cc (cygheap_root::cygheap_root): New function.
(cygheap_root::~cygheap_root): Ditto.
(cygheap_root::operator=): Ditto.
(cygheap_user::~cygheap_user): Ditto.
(cygheap_user::set_name): Ditto.
(cygheap_user::set_logsrv): Ditto.
(cygheap_user::set_domain): Ditto.
(cygheap_user::set_sid): Ditto.
* cygheap.h (cygheap_root): New class.
(cygheap_user): Ditto.
(init_cygheap): Change type of `root' member to cygheap_root.
Add `user' member.
* dir.cc (opendir): Use new `cygheap_root' class.
* dcrt0.cc (dll_crt0_1): Use new `cygheap_user' class.
* fork.cc (fork_parent): Ditto.
* grp.cc (getgroups): Ditto.
* passwd.cc (search_for): Ditto.
* path.cc: Use new `cygheap_root' class throughout.
* pinfo.h (_pinfo): Remove `use_psid'. Move `username', `psid',
`logsrv', `domain', `orig_{uid,gid}' and `real_{uid,gid}' to
cygheap_user class.
* security.cc: Use new `cygheap_user' class throughout.
* shared.cc (sec_user): Ditto.
* sigproc.cc (proc_subproc): Remove copy statements for user
related information moved to `cygheap_user' class.
* spawn.cc (spawn_guts): Invalidate current chroot settings
when creating Windows environment. Use new `cygheap_user' class.
* syscalls.cc: Use new `cygheap_user' class throughout.
* uinfo.cc: Ditto.
* uinfo.cc (internal_getlogin): Change parameters to reflect the
move of user information to cygheap.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r-- | winsup/cygwin/syscalls.cc | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 348a49b8b..90cc1b785 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -704,7 +704,7 @@ chown_worker (const char *name, unsigned fmode, uid_t uid, gid_t gid) res = set_file_attribute (win32_path.has_acls (), win32_path.get_win32 (), uid, gid, attrib, - myself->logsrv); + cygheap->user.logsrv ()); } if (res != 0 && get_errno () == ENOSYS) { @@ -815,7 +815,7 @@ chmod (const char *path, mode_t mode) if (! set_file_attribute (win32_path.has_acls (), win32_path.get_win32 (), uid, gid, - mode, myself->logsrv) + mode, cygheap->user.logsrv ()) && allow_ntsec) res = 0; @@ -1796,7 +1796,7 @@ setgid (gid_t gid) { int ret = setegid (gid); if (!ret) - myself->real_gid = myself->gid; + cygheap->user.real_gid = myself->gid; return ret; } @@ -1806,12 +1806,12 @@ setuid (uid_t uid) { int ret = seteuid (uid); if (!ret) - myself->real_uid = myself->uid; - debug_printf ("real: %d, effective: %d", myself->real_uid, myself->uid); + cygheap->user.real_uid = myself->uid; + debug_printf ("real: %d, effective: %d", cygheap->user.real_uid, myself->uid); return ret; } -extern char *internal_getlogin (_pinfo *pi); +extern const char *internal_getlogin (cygheap_user &user, HANDLE token); /* seteuid: standards? */ extern "C" int @@ -1830,7 +1830,7 @@ seteuid (uid_t uid) } if (uid != myself->uid) - if (uid == myself->orig_uid) + if (uid == cygheap->user.orig_uid) { debug_printf ("RevertToSelf() (uid == orig_uid, token=%d)", myself->token); @@ -1850,32 +1850,28 @@ seteuid (uid_t uid) myself->impersonated = TRUE; } - struct _pinfo pi; - /* pi.token is used in internal_getlogin() to determine if + cygheap_user user; + /* token is used in internal_getlogin() to determine if impersonation is active. If so, the token is used for retrieving user's SID. */ - pi.token = myself->impersonated ? myself->token - : INVALID_HANDLE_VALUE; - struct passwd *pw_cur = getpwnam (internal_getlogin (&pi)); + HANDLE token = myself->impersonated ? myself->token + : INVALID_HANDLE_VALUE; + struct passwd *pw_cur = getpwnam (internal_getlogin (user, token)); if (pw_cur != pw_new) { debug_printf ("Diffs!!! token: %d, cur: %d, new: %d, orig: %d", myself->token, pw_cur->pw_uid, - pw_new->pw_uid, myself->orig_uid); + pw_new->pw_uid, cygheap->user.orig_uid); set_errno (EPERM); return -1; } myself->uid = uid; - strcpy (myself->username, pi.username); - strcpy (myself->logsrv, pi.logsrv); - strcpy (myself->domain, pi.domain); - memcpy (myself->psid, pi.psid, MAX_SID_LEN); - myself->use_psid = 1; + cygheap->user = user; } } else set_errno (ENOSYS); - debug_printf ("real: %d, effective: %d", myself->real_uid, myself->uid); + debug_printf ("real: %d, effective: %d", cygheap->user.real_uid, myself->uid); return 0; } @@ -1930,11 +1926,7 @@ chroot (const char *newroot) set_errno (ret); goto done; } - cygheap->rootlen = strlen (cygheap->root); - if (cygheap->rootlen > 1 && buf[cygheap->rootlen - 1] == '/') - buf[--cygheap->rootlen] = '\0'; - cygheap->root = (char *) crealloc (cygheap->root, cygheap->rootlen + 1); - strcpy (cygheap->root, buf); + cygheap->root = buf; ret = 0; done: |