diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 95f7d5efd..fc0a07ad9 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2002-06-05 Corinna Vinschen + + * 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. + 2002-06-05 Corinna Vinschen * grp.cc (etc_group): Removed. diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc index 13f74dd64..25d2ff864 100644 --- a/winsup/cygwin/grp.cc +++ b/winsup/cygwin/grp.cc @@ -171,19 +171,49 @@ read_etc_group () SID_NAME_USE acType; static char linebuf [200]; - debug_printf ("Emulating /etc/group"); - strncpy (group_name, "Administrators", sizeof (group_name)); - if (! LookupAccountSidA (NULL, well_known_admins_sid, group_name, - &group_name_len, domain_name, - &domain_name_len, &acType)) + if (wincap.has_security ()) { - strcpy (group_name, "unknown"); - debug_printf ("Failed to get local admins group name. %E"); + HANDLE ptok; + cygsid tg; + DWORD siz; + + if (OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok)) + { + if (GetTokenInformation (ptok, TokenPrimaryGroup, &tg, + sizeof tg, &siz) + && LookupAccountSidA (NULL, tg, group_name, + &group_name_len, domain_name, + &domain_name_len, &acType)) + { + char strbuf[100]; + snprintf (linebuf, sizeof (linebuf), "%s:%s:%u:", + group_name, + tg.string (strbuf), + *GetSidSubAuthority(tg, + *GetSidSubAuthorityCount(tg) - 1)); + debug_printf ("Emulating /etc/group: %s", linebuf); + add_grp_line (linebuf); + group_state = emulated; + } + CloseHandle (ptok); + } + } + if (group_state != emulated) + { + strncpy (group_name, "Administrators", sizeof (group_name)); + if (!LookupAccountSidA (NULL, well_known_admins_sid, group_name, + &group_name_len, domain_name, + &domain_name_len, &acType)) + { + strcpy (group_name, "unknown"); + debug_printf ("Failed to get local admins group name. %E"); + } + snprintf (linebuf, sizeof (linebuf), "%s::%u:", group_name, + (unsigned) DEFAULT_GID); + debug_printf ("Emulating /etc/group: %s", linebuf); + add_grp_line (linebuf); + group_state = emulated; } - snprintf (linebuf, sizeof (linebuf), "%s::%u:\n", group_name, - (unsigned) DEFAULT_GID); - add_grp_line (linebuf); - group_state = emulated; } } 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]; + static char linebuf[1024]; - 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; + 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; + } } }