svn commit: r194388 - in projects/ngroups: lib/libc/gen
lib/libc/rpc usr.bin/id usr.bin/newgrp usr.bin/quota
usr.sbin/chown usr.sbin/chroot usr.sbin/jail usr.sbin/jexec
usr.sbin/lpr/lpc
Brooks Davis
brooks at FreeBSD.org
Wed Jun 17 19:01:47 UTC 2009
Author: brooks
Date: Wed Jun 17 19:01:47 2009
New Revision: 194388
URL: http://svn.freebsd.org/changeset/base/194388
Log:
Consistently use arrays of {NGROUPS_MAX}+1 with getgroups() and
getgrouplist(). In doing so, use the pattern from the example from the
posix manpages where ngroups_max is a long and set to
sysconf(_SC_NGROUPS_MAX)+1.
In id(1), don't use a combination of getgid() and getgroups() to
retrieve the list of groups. There's no need to account for the
possibility that getgroups does not return the primary gid, espeically
when we only do it in of of the two cases.
Modified:
projects/ngroups/lib/libc/gen/initgroups.c
projects/ngroups/lib/libc/rpc/auth_unix.c
projects/ngroups/usr.bin/id/id.c
projects/ngroups/usr.bin/newgrp/newgrp.c
projects/ngroups/usr.bin/quota/quota.c
projects/ngroups/usr.sbin/chown/chown.c
projects/ngroups/usr.sbin/chroot/chroot.c
projects/ngroups/usr.sbin/jail/jail.c
projects/ngroups/usr.sbin/jexec/jexec.c
projects/ngroups/usr.sbin/lpr/lpc/lpc.c
Modified: projects/ngroups/lib/libc/gen/initgroups.c
==============================================================================
--- projects/ngroups/lib/libc/gen/initgroups.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/lib/libc/gen/initgroups.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -49,16 +49,18 @@ initgroups(uname, agroup)
gid_t agroup;
{
int ngroups, ret;
+ long ngroups_max;
gid_t *groups;
/*
* Provide space for one group more than possible to allow
* setgroups to fail and set errno.
*/
- ngroups = sysconf(_SC_NGROUPS_MAX) + 1;
- if ((groups = malloc(sizeof(*groups) * ngroups)) == NULL)
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 2;
+ if ((groups = malloc(sizeof(*groups) * ngroups_max)) == NULL)
return (ENOMEM);
+ ngroups = (int)ngroups_max;
getgrouplist(uname, agroup, groups, &ngroups);
ret = setgroups(ngroups, groups);
free(groups);
Modified: projects/ngroups/lib/libc/rpc/auth_unix.c
==============================================================================
--- projects/ngroups/lib/libc/rpc/auth_unix.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/lib/libc/rpc/auth_unix.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -186,13 +186,14 @@ AUTH *
authunix_create_default()
{
int ngids;
+ long ngids_max;
char machname[MAXHOSTNAMELEN + 1];
uid_t uid;
gid_t gid;
gid_t *gids;
- ngids = sysconf(_SC_NGROUPS_MAX);
- gids = malloc(sizeof(gid_t) * ngids);
+ ngids_max = sysconf(_SC_NGROUPS_MAX) + 1;
+ gids = malloc(sizeof(gid_t) * ngids_max);
if (gids == NULL)
return (NULL);
@@ -201,7 +202,7 @@ authunix_create_default()
machname[sizeof(machname) - 1] = 0;
uid = geteuid();
gid = getegid();
- if ((ngids = getgroups(NGROUPS_MAX, gids)) < 0)
+ if ((ngids = getgroups(ngids_max, gids)) < 0)
abort();
if (ngids > NGRPS)
ngids = NGRPS;
Modified: projects/ngroups/usr.bin/id/id.c
==============================================================================
--- projects/ngroups/usr.bin/id/id.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/usr.bin/id/id.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -257,7 +257,8 @@ id_print(struct passwd *pw, int use_ggl,
struct group *gr;
gid_t gid, egid, lastgid;
uid_t uid, euid;
- int cnt, ngroups, ngroups_max;
+ int cnt, ngroups;
+ long ngroups_max;
gid_t *groups;
const char *fmt;
@@ -270,16 +271,16 @@ id_print(struct passwd *pw, int use_ggl,
gid = getgid();
}
- ngroups_max = sysconf(_SC_NGROUPS_MAX);
- if ((groups = malloc(sizeof(gid_t) * (ngroups_max + 1))) == NULL)
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
+ if ((groups = malloc(sizeof(gid_t) * ngroups_max)) == NULL)
err(1, "malloc");
if (use_ggl && pw != NULL) {
- ngroups = ngroups_max + 1;
+ ngroups = ngroups_max;
getgrouplist(pw->pw_name, gid, groups, &ngroups);
}
else {
- ngroups = getgroups(ngroups_max + 1, groups);
+ ngroups = getgroups(ngroups_max, groups);
}
if (pw != NULL)
@@ -365,20 +366,20 @@ void
group(struct passwd *pw, int nflag)
{
struct group *gr;
- int cnt, id, lastid, ngroups, ngroups_max;
+ int cnt, id, lastid, ngroups;
+ long ngroups_max;
gid_t *groups;
const char *fmt;
- ngroups_max = sysconf(_SC_NGROUPS_MAX);
- if ((groups = malloc(sizeof(gid_t) * (ngroups_max + 1))) == NULL)
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
+ if ((groups = malloc(sizeof(gid_t) * (ngroups_max))) == NULL)
err(1, "malloc");
if (pw) {
- ngroups = ngroups_max + 1;
+ ngroups = ngroups_max;
(void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
} else {
- groups[0] = getgid();
- ngroups = getgroups(ngroups_max, groups + 1) + 1;
+ ngroups = getgroups(ngroups_max, groups);
}
fmt = nflag ? "%s" : "%u";
for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) {
Modified: projects/ngroups/usr.bin/newgrp/newgrp.c
==============================================================================
--- projects/ngroups/usr.bin/newgrp/newgrp.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/usr.bin/newgrp/newgrp.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -147,8 +147,8 @@ static void
addgroup(const char *grpname)
{
gid_t *grps;
- long lgid;
- int dbmember, i, ngrps, ngrps_max;
+ long lgid, ngrps_max;
+ int dbmember, i, ngrps;
gid_t egid;
struct group *grp;
char *ep, *pass;
@@ -185,7 +185,7 @@ addgroup(const char *grpname)
}
}
- ngrps_max = sysconf(_SC_NGROUPS_MAX);
+ ngrps_max = sysconf(_SC_NGROUPS_MAX) + 1;
if ((grps = malloc(sizeof(gid_t) * ngrps_max)) == NULL)
err(1, "malloc");
if ((ngrps = getgroups(ngrps_max, (gid_t *)grps)) < 0) {
Modified: projects/ngroups/usr.bin/quota/quota.c
==============================================================================
--- projects/ngroups/usr.bin/quota/quota.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/usr.bin/quota/quota.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -117,6 +117,7 @@ int
main(int argc, char *argv[])
{
int ngroups;
+ long ngroups_max;
gid_t mygid, *gidset;
int i, ch, gflag = 0, uflag = 0, errflag = 0;
@@ -159,10 +160,11 @@ main(int argc, char *argv[])
errflag += showuid(getuid());
if (gflag) {
mygid = getgid();
- ngroups = sysconf(_SC_NGROUPS_MAX);
- if ((gidset = malloc(sizeof(gid_t) * ngroups)) == NULL)
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
+ if ((gidset = malloc(sizeof(gid_t) * ngroups_max))
+ == NULL)
err(1, "malloc");
- ngroups = getgroups(ngroups, gidset);
+ ngroups = getgroups(ngroups_max, gidset);
if (ngroups < 0)
err(1, "getgroups");
errflag += showgid(mygid);
Modified: projects/ngroups/usr.sbin/chown/chown.c
==============================================================================
--- projects/ngroups/usr.sbin/chown/chown.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/usr.sbin/chown/chown.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -268,7 +268,8 @@ void
chownerr(const char *file)
{
static uid_t euid = -1;
- static int ngroups = -1, ngroups_max;
+ static int ngroups = -1;
+ static long ngroups_max;
gid_t *groups;
/* Check for chown without being root. */
@@ -281,7 +282,7 @@ chownerr(const char *file)
/* Check group membership; kernel just returns EPERM. */
if (gid != (gid_t)-1 && ngroups == -1 &&
euid == (uid_t)-1 && (euid = geteuid()) != 0) {
- ngroups_max = sysconf(_SC_NGROUPS_MAX);
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
if ((groups = malloc(sizeof(gid_t) * ngroups_max)) == NULL)
err(1, "malloc");
ngroups = getgroups(ngroups_max, groups);
Modified: projects/ngroups/usr.sbin/chroot/chroot.c
==============================================================================
--- projects/ngroups/usr.sbin/chroot/chroot.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/usr.sbin/chroot/chroot.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -71,7 +71,8 @@ main(argc, argv)
const char *shell;
gid_t gid, *gidlist;
uid_t uid;
- int ch, gids, ngroups_max;
+ int ch, gids;
+ long ngroups_max;
gid = 0;
uid = 0;
@@ -117,7 +118,7 @@ main(argc, argv)
}
}
- ngroups_max = sysconf(_SC_NGROUPS_MAX);
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
if ((gidlist = malloc(sizeof(gid_t) * ngroups_max)) == NULL)
err(1, "malloc");
for (gids = 0;
Modified: projects/ngroups/usr.sbin/jail/jail.c
==============================================================================
--- projects/ngroups/usr.sbin/jail/jail.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/usr.sbin/jail/jail.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -119,6 +119,7 @@ main(int argc, char **argv)
size_t sysvallen;
int ch, cmdarg, i, jail_set_flags, jid, ngroups, sysval;
int hflag, iflag, Jflag, lflag, rflag, uflag, Uflag;
+ long ngroups_max;
unsigned pi;
char *ep, *jailname, *securelevel, *username, *JidFile;
char errmsg[ERRMSG_SIZE], enforce_statfs[4];
@@ -132,7 +133,7 @@ main(int argc, char **argv)
jailname = securelevel = username = JidFile = cleanenv = NULL;
fp = NULL;
- ngroups_max = sysconf(_SC_NGROUPS_MAX);
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
if ((groups = malloc(sizeof(gid_t) * ngroups_max)) == NULL)
err(1, "malloc");
Modified: projects/ngroups/usr.sbin/jexec/jexec.c
==============================================================================
--- projects/ngroups/usr.sbin/jexec/jexec.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/usr.sbin/jexec/jexec.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -72,12 +72,13 @@ main(int argc, char *argv[])
login_cap_t *lcap = NULL;
struct passwd *pwd = NULL;
gid_t *groups = NULL;
- int ch, ngroups, ngroups_max, uflag, Uflag;
+ int ch, ngroups, uflag, Uflag;
+ long ngroups_max;
char *ep, *username;
ch = uflag = Uflag = 0;
username = NULL;
- ngroups_max = sysconf(_SC_NGROUPS_MAX);
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
if ((groups = malloc(sizeof(gid_t) * ngroups_max)) == NULL)
err(1, "malloc");
Modified: projects/ngroups/usr.sbin/lpr/lpc/lpc.c
==============================================================================
--- projects/ngroups/usr.sbin/lpr/lpc/lpc.c Wed Jun 17 18:55:29 2009 (r194387)
+++ projects/ngroups/usr.sbin/lpr/lpc/lpc.c Wed Jun 17 19:01:47 2009 (r194388)
@@ -356,6 +356,7 @@ ingroup(const char *grname)
{
static struct group *gptr=NULL;
static int ngroups = 0;
+ static long ngroups_max;
static gid_t *groups;
register gid_t gid;
register int i;
@@ -365,10 +366,10 @@ ingroup(const char *grname)
warnx("warning: unknown group '%s'", grname);
return(0);
}
- ngroups = sysconf(_SC_NGROUPS_MAX);
- if ((groups = malloc(sizeof(gid_t) * ngroups)) == NULL)
+ ngroups_max = sysconf(_SC_NGROUPS_MAX);
+ if ((groups = malloc(sizeof(gid_t) * ngroups_max)) == NULL)
err(1, "malloc");
- ngroups = getgroups(ngroups, groups);
+ ngroups = getgroups(ngroups_max, groups);
if (ngroups < 0)
err(1, "getgroups");
}
More information about the svn-src-projects
mailing list