]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
more diagnostics when getgrouplist fails
authorDamien Miller <djm@mindrot.org>
Fri, 11 Jul 2025 22:36:49 +0000 (15:36 -0700)
committerDamien Miller <djm@mindrot.org>
Fri, 11 Jul 2025 22:36:49 +0000 (15:36 -0700)
groupaccess.c

index 9d03ded0cd5d6e9c1ed26508ba46b5cdb7973aac..b85782472b8503e06a2f1be88c6c14cf4ca47adb 100644 (file)
@@ -50,21 +50,24 @@ int
 ga_init(const char *user, gid_t base)
 {
        gid_t *groups_bygid;
-       int i, j, retry = 0;
+       int ongroups, i, j, retry = 0;
        struct group *gr;
 
        if (ngroups > 0)
                ga_free();
 
-       ngroups = NGROUPS_MAX;
+       ongroups = ngroups = NGROUPS_MAX;
 #if defined(HAVE_SYSCONF) && defined(_SC_NGROUPS_MAX)
-       ngroups = MAX(NGROUPS_MAX, sysconf(_SC_NGROUPS_MAX));
+       ongroups = ngroups = MAX(NGROUPS_MAX, sysconf(_SC_NGROUPS_MAX));
 #endif
 
        groups_bygid = xcalloc(ngroups, sizeof(*groups_bygid));
        while (getgrouplist(user, base, groups_bygid, &ngroups) == -1) {
-               if (retry++ > 0)
-                       fatal("getgrouplist: groups list too small");
+               if (retry++ > 0) {
+                       fatal("getgrouplist(\"%s\", %ld): groups list too big "
+                           "(have %ld, need %ld)", user, (long)base,
+                           (long)ongroups, (long)ngroups);
+               }
                groups_bygid = xreallocarray(groups_bygid, ngroups,
                    sizeof(*groups_bygid));
        }