* fork.cc (fork): Fix error in copying SID pointer.

* spawn.cc (_spawnve): Ditto.
        * passwd.cc: Remove static from `passwd_in_memory_p'.
        (read_etc_passwd): Remove static.
        * uinfo.cc: Move global declaration of `read_etc_group' and
        `group_in_memory_p' into `uinfo_init'.
        (internal_getlogin): Try to get SID from current process first.
        (uinfo_init): Don't set uid and gid if `myself' has a valid SID.
        Only load /etc/passwd and /etc/group in that case.
This commit is contained in:
Corinna Vinschen 2000-06-24 17:37:52 +00:00
parent 92b3b0a6ad
commit bb34ad9674
5 changed files with 56 additions and 15 deletions

View File

@ -1,3 +1,15 @@
Sat Jun 24 19:30:00 2000 Corinna Vinschen <corinna@vinschen.de>
* fork.cc (fork): Fix error in copying SID pointer.
* spawn.cc (_spawnve): Ditto.
* passwd.cc: Remove static from `passwd_in_memory_p'.
(read_etc_passwd): Remove static.
* uinfo.cc: Move global declaration of `read_etc_group' and
`group_in_memory_p' into `uinfo_init'.
(internal_getlogin): Try to get SID from current process first.
(uinfo_init): Don't set uid and gid if `myself' has a valid SID.
Only load /etc/passwd and /etc/group in that case.
Sat Jun 24 12:29:59 2000 Christopher Faylor <cgf@cygnus.com> Sat Jun 24 12:29:59 2000 Christopher Faylor <cgf@cygnus.com>
* shared.cc (shared_info::initialize): Improve error message clarity. * shared.cc (shared_info::initialize): Improve error message clarity.

View File

@ -419,8 +419,9 @@ fork ()
child->process_state |= PID_INITIALIZING | child->process_state |= PID_INITIALIZING |
(myself->process_state & PID_USETTY); (myself->process_state & PID_USETTY);
memcpy (child->username, myself->username, MAX_USER_NAME); memcpy (child->username, myself->username, MAX_USER_NAME);
child->psid = myself->psid;
memcpy (child->sidbuf, myself->sidbuf, 40); memcpy (child->sidbuf, myself->sidbuf, 40);
if (myself->psid)
child->psid = child->sidbuf;
memcpy (child->logsrv, myself->logsrv, 256); memcpy (child->logsrv, myself->logsrv, 256);
memcpy (child->domain, myself->domain, MAX_COMPUTERNAME_LENGTH+1); memcpy (child->domain, myself->domain, MAX_COMPUTERNAME_LENGTH+1);
child->token = myself->token; child->token = myself->token;

View File

@ -24,7 +24,7 @@ static int max_lines = 0;
/* Set to 1 when /etc/passwd has been read in by read_etc_passwd (). */ /* Set to 1 when /etc/passwd has been read in by read_etc_passwd (). */
/* Functions in this file need to check the value of passwd_in_memory_p /* Functions in this file need to check the value of passwd_in_memory_p
and read in the password file if it isn't set. */ and read in the password file if it isn't set. */
static int passwd_in_memory_p = 0; int passwd_in_memory_p = 0;
/* Position in the passwd cache */ /* Position in the passwd cache */
#ifdef _MT_SAFE #ifdef _MT_SAFE
@ -103,7 +103,7 @@ add_pwd_line (char *line)
/* Read in /etc/passwd and save contents in the password cache. /* Read in /etc/passwd and save contents in the password cache.
This sets passwd_in_memory_p to 1 so functions in this file can This sets passwd_in_memory_p to 1 so functions in this file can
tell that /etc/passwd has been read in */ tell that /etc/passwd has been read in */
static void void
read_etc_passwd () read_etc_passwd ()
{ {
extern int passwd_sem; extern int passwd_sem;

View File

@ -847,8 +847,9 @@ _spawnve (HANDLE hToken, int mode, const char *path, const char *const *argv,
if (!hToken && !myself->token) if (!hToken && !myself->token)
{ {
memcpy (child->username, myself->username, MAX_USER_NAME); memcpy (child->username, myself->username, MAX_USER_NAME);
child->psid = myself->psid;
memcpy (child->sidbuf, myself->sidbuf, 40); memcpy (child->sidbuf, myself->sidbuf, 40);
if (myself->psid)
child->psid = child->sidbuf;
memcpy (child->logsrv, myself->logsrv, 256); memcpy (child->logsrv, myself->logsrv, 256);
memcpy (child->domain, myself->domain, MAX_COMPUTERNAME_LENGTH+1); memcpy (child->domain, myself->domain, MAX_COMPUTERNAME_LENGTH+1);
} }

View File

@ -18,11 +18,6 @@ details. */
#include <wchar.h> #include <wchar.h>
#include <lm.h> #include <lm.h>
/* FIXME: shouldn't violate internal object space -- these two
should be static inside grp.cc */
void read_etc_group ();
extern int group_in_memory_p;
char * char *
internal_getlogin (struct pinfo *pi) internal_getlogin (struct pinfo *pi)
{ {
@ -95,21 +90,42 @@ internal_getlogin (struct pinfo *pi)
} }
if (allow_ntsec) if (allow_ntsec)
{ {
/* Try to get the SID from localhost first. This can only HANDLE ptok = INVALID_HANDLE_VALUE;
be done if a domain is given because there's a chance that DWORD siz;
a local and a domain user may have the same name. */ char tu[1024];
int ret = 0; int ret = 0;
/* Try to get the SID from current process first */
if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok))
debug_printf ("OpenProcessToken(): %E\n");
else if (!GetTokenInformation (ptok, TokenUser, (LPVOID) &tu,
sizeof tu, &siz))
debug_printf ("GetTokenInformation(): %E");
else if (!(ret = CopySid (40, (PSID) pi->sidbuf,
((TOKEN_USER *) &tu)->User.Sid)))
debug_printf ("Couldn't retrieve SID from access token!");
if (ptok != INVALID_HANDLE_VALUE)
CloseHandle (ptok);
if (pi->domain[0]) /* If that failes, try to get the SID from localhost. This can only
be done if a domain is given because there's a chance that a local
and a domain user may have the same name. */
if (!ret && pi->domain[0])
{ {
/* Concat DOMAIN\USERNAME for the next lookup */ /* Concat DOMAIN\USERNAME for the next lookup */
strcat (strcat (strcpy (buf, pi->domain), "\\"), pi->username); strcat (strcat (strcpy (buf, pi->domain), "\\"), pi->username);
if (!(ret = lookup_name (buf, NULL, (PSID) pi->sidbuf))) if (!(ret = lookup_name (buf, NULL, (PSID) pi->sidbuf)))
debug_printf ("Couldn't retrieve SID locally!"); debug_printf ("Couldn't retrieve SID locally!");
} }
/* If that failes, too, as a last resort try to get the SID from
the logon server. */
if (!ret && !(ret = lookup_name(pi->username, pi->logsrv, if (!ret && !(ret = lookup_name(pi->username, pi->logsrv,
(PSID)pi->sidbuf))) (PSID)pi->sidbuf)))
debug_printf ("Couldn't retrieve SID from '%s'!", pi->logsrv); debug_printf ("Couldn't retrieve SID from '%s'!", pi->logsrv);
/* If we have a SID, try to get the corresponding Cygwin user name
which can be different from the Windows user name. */
if (ret) if (ret)
{ {
struct passwd *pw; struct passwd *pw;
@ -140,6 +156,11 @@ internal_getlogin (struct pinfo *pi)
void void
uinfo_init () uinfo_init ()
{ {
void read_etc_passwd ();
extern int passwd_in_memory_p;
void read_etc_group ();
extern int group_in_memory_p;
char *username; char *username;
struct passwd *p; struct passwd *p;
@ -147,8 +168,14 @@ uinfo_init ()
another cygwin process without changing the user context. another cygwin process without changing the user context.
So all user infos in myself as well as the environment are So all user infos in myself as well as the environment are
(perhaps) valid. */ (perhaps) valid. */
username = myself->psid ? myself->username : internal_getlogin (myself); if (myself->psid)
if ((p = getpwnam (username)) != NULL) {
if (!passwd_in_memory_p)
read_etc_passwd();
if (!group_in_memory_p)
read_etc_group ();
}
else if ((p = getpwnam (username = internal_getlogin (myself))) != NULL)
{ {
/* calling getpwnam assures us that /etc/password has been /* calling getpwnam assures us that /etc/password has been
read in, but we can't be sure about /etc/group */ read in, but we can't be sure about /etc/group */