On Thu, 18 Dec 2025 12:23:05 +0100
Corinna Vinschen wrote:
> From: Corinna Vinschen <[email protected]>
> 
> Commit dc7b67316d01 ("Cygwin: uinfo: prefer token primary group")
> broke the code overriding the primary group in two different ways:
> 
> - It changed the way myself->gid was set before checking its value.
> 
>   Prior to dc7b67316d01, myself->gid was always set to the primary group
>   from the passwd entry (pw_gid).  With the patch, it was set to the
>   primary group from the Windows user token (token_gid) in the first
>   place.
> 
>   The following condition checking if pw_gid is different
>   from token_gid did so, by checking token_gid against myself->gid,
>   rather than against pw_gid.  After dc7b67316d01 this was always
>   false and the code block overriding the primary group in Cygwin and
>   the Windows user token with pw_gid was never called anymore.
> 
>   The solution is obvious: Do not check token_gid against myself->gid,
>   but against the desires primary GID value in pw_gid instead.
> 
> - The code block overriding the primary group simply assumed that
>   myself->gid was already set to pw_gid, but, as outlined above,
>   this was not true anymore after dc7b67316d01.
> 
>   This is a subtil error, because it leads to having the wrong primary
>   GID in `id' output, while the primary group SID in the user token was
>   correctly set.  But as soon as you run this under strace or GDB, the
>   problem disappears, because the second process tree under GDB or
>   strace takes over from the already changed user token.
> 
>   The solution is to override myself->gid with pw_gid once more, after
>   successfully changing the primary GID to pw_gid.
> 
> Fixes: dc7b67316d01 ("Cygwin: uinfo: prefer token primary group")
> Signed-off-by: Corinna Vinschen <[email protected]>
> ---
>  winsup/cygwin/uinfo.cc | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
> index ffe71ee0726c..8e9b9e07de9d 100644
> --- a/winsup/cygwin/uinfo.cc
> +++ b/winsup/cygwin/uinfo.cc
> @@ -174,7 +174,7 @@ internal_getlogin (cygheap_user &user)
>        gsid = cygheap->dom.account_sid ();
>        gsid.append (DOMAIN_GROUP_RID_USERS);
>        if (!pgrp
> -       || (myself->gid != pgrp->gr_gid
> +       || (pwd->pw_gid != pgrp->gr_gid
>             && cygheap->dom.account_sid () != cygheap->dom.primary_sid ()
>             && RtlEqualSid (gsid, user.groups.pgsid)))
>       {
> @@ -209,7 +209,10 @@ internal_getlogin (cygheap_user &user)
>                       myself->gid = pwd->pw_gid = pgrp->gr_gid;
>                   }
>                 else
> -                 user.groups.pgsid = gsid;
> +                 {
> +                   user.groups.pgsid = gsid;
> +                   myself->gid = pwd->pw_gid;
> +                 }
>                 clear_procimptoken ();
>               }
>           }
> -- 
> 2.52.0
> 

LGTM. Please wait a bit for patches 2/4 and 3/4.

-- 
Takashi Yano <[email protected]>

Reply via email to