use sysconf instead of NGROUPS_MAX

Sven Rudolph rudsve at
Thu Feb 3 14:01:37 GMT 2000

Currently samba (2.0.6) relies on the NGROUPS_MAX define. This makes
the number of allowed simultaneous (per-user) secondary groups a
compile-time decision.

$ find . -name \*.c | xargs grep NGROUPS   
./source/lib/system.c:  if (setlen > NGROUPS_MAX) {
./source/lib/replace.c: gid_t  grouplst[NGROUPS_MAX];
./source/lib/replace.c: while (i < NGROUPS_MAX && 
./source/smbd/password.c:#ifdef NGROUPS_MAX
./source/smbd/password.c:       if((groups = (gid_t *)malloc(sizeof(gid_t)*NGROUPS_MAX)) == NULL)

POSIX defined sysconf in order to avoid this.

By using sysconf(_SC_NGROUPS_MAX) this value is determined at

OTOH NGROUPS_MAX seems to be used incorrectly anyway:

        if((groups = (gid_t *)malloc(sizeof(gid_t)*NGROUPS_MAX)) == NULL)
#else /* NGROUPS_MAX */
        if((groups = (gid_t *)malloc(sizeof(gid_t)*ngroups)) == NULL)
#endif /* NGROUPS_MAX */

As Donald Lewine's POSIX book says: "The values returned by these
functions should be thought of as minimum guarantees. ... The values
returned by sysconf() and pathconf() are not suitable for allocating

Running samba on Linux only above-showed source/smbd/password.c seems
to be a problem since the other NGROUPS_MAX occurences only matter
when things like a sane initgroups are missing.

Suggestions etc. ?


More information about the samba mailing list