diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2002-06-05 15:56:56 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2002-06-05 15:56:56 +0400 |
commit | eceee297d5c2f508e247f803b32bf4817716bc38 (patch) | |
tree | 4cb954c333a09503063aee7f8aabea5b826ef6c7 /winsup/cygwin/passwd.cc | |
parent | 38f39368891d83c63e6f4aa3b00b19b80444b041 (diff) |
* grp.cc (read_etc_group): When emulating nonexisting group file on
NT systems, read primary group SID from process token. Use that info
to create correct group entry. On error or on 9x systems fallback
to emulating Administrators group as before.
(read_etc_passwd): When emulating nonexisting passwd file on NT systems,
read user and primary group SID from process token. Use that info to
create correct passwd entry. On error or on 9x systems fallback to
emulating user with Administrator user id and Administrators group
as before.
Diffstat (limited to 'winsup/cygwin/passwd.cc')
-rw-r--r-- | winsup/cygwin/passwd.cc | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc index ac1ecf8f0..b251264b7 100644 --- a/winsup/cygwin/passwd.cc +++ b/winsup/cygwin/passwd.cc @@ -160,14 +160,46 @@ read_etc_passwd () } else { - static char linebuf[400]; - - debug_printf ("Emulating /etc/passwd"); - snprintf (linebuf, sizeof (linebuf), "%s::%u:%u::%s:/bin/sh", - cygheap->user.name (), (unsigned) DEFAULT_UID, - (unsigned) DEFAULT_GID, getenv ("HOME") ?: "/"); - add_pwd_line (linebuf); - passwd_state = emulated; + static char linebuf[1024]; + + if (wincap.has_security ()) + { + HANDLE ptok; + cygsid tu, tg; + DWORD siz; + + if (OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok)) + { + if (GetTokenInformation (ptok, TokenUser, &tu, sizeof tu, + &siz) + && GetTokenInformation (ptok, TokenPrimaryGroup, &tg, + sizeof tg, &siz)) + { + char strbuf[100]; + snprintf (linebuf, sizeof (linebuf), + "%s::%u:%u:%s:%s:/bin/sh", + cygheap->user.name (), + *GetSidSubAuthority(tu, + *GetSidSubAuthorityCount(tu) - 1), + *GetSidSubAuthority(tg, + *GetSidSubAuthorityCount(tg) - 1), + tu.string (strbuf), getenv ("HOME") ?: "/"); + debug_printf ("Emulating /etc/passwd: %s", linebuf); + add_pwd_line (linebuf); + passwd_state = emulated; + } + CloseHandle (ptok); + } + } + if (passwd_state != emulated) + { + snprintf (linebuf, sizeof (linebuf), "%s::%u:%u::%s:/bin/sh", + cygheap->user.name (), (unsigned) DEFAULT_UID, + (unsigned) DEFAULT_GID, getenv ("HOME") ?: "/"); + debug_printf ("Emulating /etc/passwd: %s", linebuf); + add_pwd_line (linebuf); + passwd_state = emulated; + } } } |