[newlib-cygwin/main] Cygwin: accounts: (re-)add flag for unix uid/gid caching
Corinna Vinschen
corinna@sourceware.org
Mon Feb 2 23:15:43 GMT 2026
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=2ca642dd6a6322915c4277b80d8c7c30058a434b
commit 2ca642dd6a6322915c4277b80d8c7c30058a434b
Author: Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Tue Feb 3 00:11:09 2026 +0100
Commit: Corinna Vinschen <corinna@vinschen.de>
CommitDate: Tue Feb 3 00:14:12 2026 +0100
Cygwin: accounts: (re-)add flag for unix uid/gid caching
Commit b39fa2c88da8 ("* autoload.cc (CheckTokenMembership): Import.")
introduced a method to recycle a ldap connection throughout a call
stack. This broke caching the mapping from remote NFS or Samba
uid/gid values to Cygwin uid/gid values partially. The pldap pointer
given to pwdgrp::fetch_account_from_windows() was supposed to be NULL
if not called from getpwent/getgrent, but in fact it was set to
non-NULL in many callers for performance reasons.
Re-introduce a bool argument telling pwdgrp::fetch_account_from_windows()
if caching is desired or not, and set it to false only when called from
getpwent/getgrent.
Fixes: b39fa2c88da8 ("* autoload.cc (CheckTokenMembership): Import.")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/local_includes/pwdgrp.h | 1 +
winsup/cygwin/passwd.cc | 2 +-
winsup/cygwin/release/3.6.7 | 3 +++
winsup/cygwin/uinfo.cc | 15 ++++++++-------
4 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/winsup/cygwin/local_includes/pwdgrp.h b/winsup/cygwin/local_includes/pwdgrp.h
index 8f3ef3adb03e..5bc8bcf22f75 100644
--- a/winsup/cygwin/local_includes/pwdgrp.h
+++ b/winsup/cygwin/local_includes/pwdgrp.h
@@ -105,6 +105,7 @@ class pwdgrp
char *fetch_account_from_line (fetch_user_arg_t &arg, const char *line);
char *fetch_account_from_file (fetch_user_arg_t &arg);
char *fetch_account_from_windows (fetch_user_arg_t &arg,
+ bool ugid_caching = false,
cyg_ldap *pldap = NULL);
char *fetch_account_from_cygserver (fetch_user_arg_t &arg);
diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc
index b8457a46f963..35cc39d5aa54 100644
--- a/winsup/cygwin/passwd.cc
+++ b/winsup/cygwin/passwd.cc
@@ -627,7 +627,7 @@ pg_ent::enumerate_ad ()
full.acc_type = SidTypeAlias;
else
full.acc_type = group ? SidTypeGroup : SidTypeUser;
- char *line = pg.fetch_account_from_windows (arg, &cldap);
+ char *line = pg.fetch_account_from_windows (arg, false, &cldap);
if (line)
return pg.add_account_post_fetch (line, false);
ret = EIO;
diff --git a/winsup/cygwin/release/3.6.7 b/winsup/cygwin/release/3.6.7
index 5285ba042a44..1ef4e3023e00 100644
--- a/winsup/cygwin/release/3.6.7
+++ b/winsup/cygwin/release/3.6.7
@@ -10,3 +10,6 @@ Fixes:
- Correctly handle i->İ, I->ı conversion in turk lnd azerbaijani languages
(LC_CTYPE=tr_TR, tr_CY, az_AZ).
+
+- Fix uid/gid mapping from unix id to Cygwin id in certain scenarios when
+ accessing Samba or NFS shares on unixoid OS.
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 73e61cbffc82..57bb6d098d8b 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -1616,7 +1616,7 @@ pwdgrp::add_account_from_windows (cygpsid &sid, cyg_ldap *pldap)
fetch_user_arg_t arg;
arg.type = SID_arg;
arg.sid = &sid;
- char *line = fetch_account_from_windows (arg, pldap);
+ char *line = fetch_account_from_windows (arg, true, pldap);
if (!line)
return NULL;
return add_account_post_fetch (line, true);
@@ -1628,7 +1628,7 @@ pwdgrp::add_account_from_windows (const char *name, cyg_ldap *pldap)
fetch_user_arg_t arg;
arg.type = NAME_arg;
arg.name = name;
- char *line = fetch_account_from_windows (arg, pldap);
+ char *line = fetch_account_from_windows (arg, true, pldap);
if (!line)
return NULL;
return add_account_post_fetch (line, true);
@@ -1640,7 +1640,7 @@ pwdgrp::add_account_from_windows (uint32_t id, cyg_ldap *pldap)
fetch_user_arg_t arg;
arg.type = ID_arg;
arg.id = id;
- char *line = fetch_account_from_windows (arg, pldap);
+ char *line = fetch_account_from_windows (arg, true, pldap);
if (!line)
return NULL;
return add_account_post_fetch (line, true);
@@ -1653,7 +1653,7 @@ pwdgrp::add_group_from_windows (fetch_acc_t &full_acc, cyg_ldap *pldap)
fetch_user_arg_t arg;
arg.type = FULL_acc_arg;
arg.full_acc = &full_acc;
- char *line = fetch_account_from_windows (arg, pldap);
+ char *line = fetch_account_from_windows (arg, true, pldap);
if (!line)
return NULL;
return (struct group *) add_account_post_fetch (line, true);
@@ -1939,7 +1939,7 @@ pwdgrp::construct_sid_from_name (cygsid &sid, wchar_t *name, wchar_t *sep)
}
char *
-pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
+pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, bool ugid_caching, cyg_ldap *pldap)
{
/* Used in LookupAccount calls. */
WCHAR namebuf[DNLEN + 1 + UNLEN + 1], *name = namebuf;
@@ -2500,7 +2500,7 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
name, fully_qualified_name);
/* Check and, if necessary, add unix<->windows id mapping
on the fly, unless we're called from getpwent. */
- if (!pldap && cldap->is_open ())
+ if (ugid_caching && cldap->is_open ())
{
id_val = cldap->get_unix_uid ();
if (id_val != ILLEGAL_UID
@@ -2584,7 +2584,8 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
gid = gr->gr_gid;
}
char *e;
- if (!pldap && uxid && ((id_val = strtoul (uxid, &e, 10)), !*e))
+ if (ugid_caching && uxid
+ && ((id_val = strtoul (uxid, &e, 10)), !*e))
{
if (acc_type == SidTypeUser)
{
More information about the Cygwin-cvs
mailing list