summaryrefslogtreecommitdiffstats
path: root/pw
diff options
context:
space:
mode:
authorJulian Elischer <julian@FreeBSD.org>2014-03-06 19:58:03 +0000
committerJulian Elischer <julian@FreeBSD.org>2014-03-06 19:58:03 +0000
commit889d60cc0abedae41354ac84f92cbbb60cc1d5d7 (patch)
tree8f7a541dce39bc5470936c992c095b662fbebcb7 /pw
parent15d3ceac1979629648a7e3eaf5711217ee870fdc (diff)
downloadpw-darwin-889d60cc0abedae41354ac84f92cbbb60cc1d5d7.tar.gz
pw-darwin-889d60cc0abedae41354ac84f92cbbb60cc1d5d7.tar.zst
pw-darwin-889d60cc0abedae41354ac84f92cbbb60cc1d5d7.zip
Part 2 of bug 187310.. had to commit separately due to local confusion.
Don't let pw crash when give certain input. PR: 187310 Submitted by: Kim Shrier MFC after: 1 week
Diffstat (limited to 'pw')
-rw-r--r--pw/pw_user.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/pw/pw_user.c b/pw/pw_user.c
index def238c..e49de18 100644
--- a/pw/pw_user.c
+++ b/pw/pw_user.c
@@ -425,19 +425,22 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
}
grp = GETGRNAM(a_name->val);
- if (grp != NULL && *grp->gr_mem == NULL)
+ if (grp != NULL &&
+ (grp->gr_mem == NULL || *grp->gr_mem == NULL))
delgrent(GETGRNAM(a_name->val));
SETGRENT();
while ((grp = GETGRENT()) != NULL) {
int i;
char group[MAXLOGNAME];
- for (i = 0; grp->gr_mem[i] != NULL; i++) {
- if (!strcmp(grp->gr_mem[i], a_name->val)) {
- while (grp->gr_mem[i] != NULL) {
- grp->gr_mem[i] = grp->gr_mem[i+1];
- }
- strlcpy(group, grp->gr_name, MAXLOGNAME);
- chggrent(group, grp);
+ if (grp->gr_mem != NULL) {
+ for (i = 0; grp->gr_mem[i] != NULL; i++) {
+ if (!strcmp(grp->gr_mem[i], a_name->val)) {
+ while (grp->gr_mem[i] != NULL) {
+ grp->gr_mem[i] = grp->gr_mem[i+1];
+ }
+ strlcpy(group, grp->gr_name, MAXLOGNAME);
+ chggrent(group, grp);
+ }
}
}
}
@@ -908,7 +911,8 @@ pw_gidpolicy(struct userconf * cnf, struct cargs * args, char *nam, gid_t prefer
errx(EX_NOUSER, "group `%s' is not defined", a_gid->val);
}
gid = grp->gr_gid;
- } else if ((grp = GETGRNAM(nam)) != NULL && grp->gr_mem[0] == NULL) {
+ } else if ((grp = GETGRNAM(nam)) != NULL &&
+ (grp->gr_mem == NULL || grp->gr_mem[0] == NULL)) {
gid = grp->gr_gid; /* Already created? Use it anyway... */
} else {
struct cargs grpargs;
@@ -1182,14 +1186,16 @@ print_user(struct passwd * pwd, int pretty, int v7)
while ((grp=GETGRENT()) != NULL)
{
int i = 0;
- while (grp->gr_mem[i] != NULL)
- {
- if (strcmp(grp->gr_mem[i], pwd->pw_name)==0)
+ if (grp->gr_mem != NULL) {
+ while (grp->gr_mem[i] != NULL)
{
- printf(j++ == 0 ? " Groups: %s" : ",%s", grp->gr_name);
- break;
+ if (strcmp(grp->gr_mem[i], pwd->pw_name)==0)
+ {
+ printf(j++ == 0 ? " Groups: %s" : ",%s", grp->gr_name);
+ break;
+ }
+ ++i;
}
- ++i;
}
}
ENDGRENT();