[newlib-cygwin] Cygwin: Revert attempting to unload user profile after use

Corinna Vinschen corinna@sourceware.org
Mon Mar 4 16:34:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=5c4ce731ac08d6615ae759121ab7e9e824024808

commit 5c4ce731ac08d6615ae759121ab7e9e824024808
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Mon Mar 4 17:07:31 2019 +0100

    Cygwin: Revert attempting to unload user profile after use
    
    Revert "Cywin: user profile: unload impersonation user profile on exit"
    Revert "Cygwin: seteuid: allow inheriting impersonation user profile handle"
    Revert "Cygwin: user profile: add debug output to unload_user_profile"
    Revert "Cygwin: user profile: Make an effort to unload unused user profiles"
    
    This reverts commit bcb33dc4f0552e749dcb6c44e1ef7815b5db75a1.
    This reverts commit dd3730ed9c1c78176f1aab1b429bb5a105d90a44.
    This reverts commit 8eee25241e86fc596acde25c7c53723b75afee30.
    This reverts commit 71b8777a7140b79942d6e5079818cad2c3f5f07f.
    
    This patchset actually results in the following problem:
    
    - After a couple of ssh logon/logoff attempts, an interactive session
      of the same user loging in, is broken.
    
    Apparently UnloadUserProfile manages to unload the user's profile
    even while a parallel interactive session still uses the user's
    profile.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/autoload.cc |  1 -
 winsup/cygwin/cygheap.h   |  8 --------
 winsup/cygwin/pinfo.cc    |  1 -
 winsup/cygwin/sec_auth.cc |  9 ---------
 winsup/cygwin/security.h  |  1 -
 winsup/cygwin/syscalls.cc | 19 +++----------------
 winsup/cygwin/uinfo.cc    |  2 --
 7 files changed, 3 insertions(+), 38 deletions(-)

diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index c04e25c..056fac7 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -699,7 +699,6 @@ LoadDLLfuncEx (CreateEnvironmentBlock, 12, userenv, 1)
 LoadDLLfuncEx2 (CreateProfile, 16, userenv, 1, 1)
 LoadDLLfunc (DestroyEnvironmentBlock, 4, userenv)
 LoadDLLfunc (LoadUserProfileW, 8, userenv)
-LoadDLLfunc (UnloadUserProfile, 8, userenv)
 
 LoadDLLfuncEx3 (waveInAddBuffer, 12, winmm, 1, 0, 1)
 LoadDLLfuncEx3 (waveInClose, 4, winmm, 1, 0, 1)
diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h
index 4d9feb0..8877cc3 100644
--- a/winsup/cygwin/cygheap.h
+++ b/winsup/cygwin/cygheap.h
@@ -106,9 +106,6 @@ public:
   HANDLE curr_primary_token;	 /* Just a copy of external or internal token */
   HANDLE curr_imp_token;	 /* impersonation token derived from primary
 				    token */
-  HANDLE imp_profile_token;	 /* Handle to the token used to load the
-				    user profile in "imp_profile" */
-  HANDLE imp_profile;		 /* Handle to the user profile */
   bool ext_token_is_restricted;  /* external_token is restricted token */
   bool curr_token_is_restricted; /* curr_primary_token is restricted token */
   bool setuid_to_restricted;     /* switch to restricted token by setuid () */
@@ -193,11 +190,6 @@ public:
   {
     return effec_cygsid.string (buf);
   }
-  void exit ()
-  {
-    if (imp_profile_token && imp_profile)
-      unload_user_profile (imp_profile_token, imp_profile);
-  }
 
   const char __reg3 *test_uid (char *&, const char *, size_t);
 };
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc
index e29c007..064299e 100644
--- a/winsup/cygwin/pinfo.cc
+++ b/winsup/cygwin/pinfo.cc
@@ -224,7 +224,6 @@ pinfo::exit (DWORD n)
     exitcode = ((exitcode & 0xff) << 8) | ((exitcode >> 8) & 0xff);
   sigproc_printf ("Calling dlls.cleanup_forkables n %y, exitcode %y", n, exitcode);
   dlls.cleanup_forkables ();
-  cygheap->user.exit ();
   sigproc_printf ("Calling ExitProcess n %y, exitcode %y", n, exitcode);
   if (!TerminateProcess (GetCurrentProcess (), exitcode))
     system_printf ("TerminateProcess failed, %E");
diff --git a/winsup/cygwin/sec_auth.cc b/winsup/cygwin/sec_auth.cc
index 36874b6..195d20c 100644
--- a/winsup/cygwin/sec_auth.cc
+++ b/winsup/cygwin/sec_auth.cc
@@ -316,15 +316,6 @@ load_user_profile (HANDLE token, struct passwd *pw, cygpsid &usersid)
   return pi.hProfile;
 }
 
-bool
-unload_user_profile (HANDLE token, HANDLE profile)
-{
-  bool ret = UnloadUserProfile (token, profile);
-  if (!ret)
-    debug_printf ("UnloadUserProfile, %E");
-  return ret;
-}
-
 HANDLE
 lsa_open_policy (PWCHAR server, ACCESS_MASK access)
 {
diff --git a/winsup/cygwin/security.h b/winsup/cygwin/security.h
index 0ce7e8d..483a527 100644
--- a/winsup/cygwin/security.h
+++ b/winsup/cygwin/security.h
@@ -502,7 +502,6 @@ PWCHAR get_user_profile_directory (PCWSTR sidstr, PWCHAR path, SIZE_T path_len);
 
 /* Load user profile if it's not already loaded. */
 HANDLE load_user_profile (HANDLE token, struct passwd *pw, cygpsid &sid);
-bool unload_user_profile (HANDLE token, HANDLE profile);
 
 HANDLE lsa_open_policy (PWCHAR server, ACCESS_MASK access);
 void lsa_close_policy (HANDLE lsa);
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index a73af67..172b7c4 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -3603,21 +3603,8 @@ seteuid32 (uid_t uid)
     {
       NTSTATUS status;
 
-      if (!request_restricted_uid_switch
-	  && new_token != cygheap->user.imp_profile_token)
-	{
-	  if (cygheap->user.imp_profile_token && cygheap->user.imp_profile)
-	    unload_user_profile (cygheap->user.imp_profile_token,
-				 cygheap->user.imp_profile);
-	  cygheap->user.imp_profile = load_user_profile (new_token, pw_new,
-							 usersid);
-	  if (cygheap->user.imp_profile)
-	    {
-	      cygheap->user.imp_profile_token = new_token;
-	      SetHandleInformation (cygheap->user.imp_profile,
-				    HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
-	    }
-	}
+      if (!request_restricted_uid_switch)
+	load_user_profile (new_token, pw_new, usersid);
 
       /* Try setting owner to same value as user. */
       status = NtSetInformationToken (new_token, TokenOwner,
@@ -3647,7 +3634,7 @@ seteuid32 (uid_t uid)
   issamesid = (usersid == cygheap->user.sid ());
   cygheap->user.set_sid (usersid);
   cygheap->user.curr_primary_token = new_token == hProcToken ? NO_IMPERSONATION
-							     : new_token;
+							: new_token;
   cygheap->user.curr_token_is_restricted = false;
   cygheap->user.setuid_to_restricted = false;
   if (cygheap->user.curr_imp_token != NO_IMPERSONATION)
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 49614cb..bfcce00 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -239,8 +239,6 @@ uinfo_init ()
   cygheap->user.internal_token = NO_IMPERSONATION;
   cygheap->user.curr_primary_token = NO_IMPERSONATION;
   cygheap->user.curr_imp_token = NO_IMPERSONATION;
-  cygheap->user.imp_profile_token = NO_IMPERSONATION;
-  cygheap->user.imp_profile = NULL;
   cygheap->user.ext_token_is_restricted = false;
   cygheap->user.curr_token_is_restricted = false;
   cygheap->user.setuid_to_restricted = false;



More information about the Cygwin-cvs mailing list