diff options
author | Julian Elischer <julian@FreeBSD.org> | 2014-03-06 19:26:08 +0000 |
---|---|---|
committer | Julian Elischer <julian@FreeBSD.org> | 2014-03-06 19:26:08 +0000 |
commit | 15d3ceac1979629648a7e3eaf5711217ee870fdc (patch) | |
tree | 28fce21d8d80e1b276566a74f38399e54a26b2be /pw/pw_group.c | |
parent | 446019b8eaaa79091b2ed36868c88624cd0a87c7 (diff) | |
download | pw-darwin-15d3ceac1979629648a7e3eaf5711217ee870fdc.tar.gz pw-darwin-15d3ceac1979629648a7e3eaf5711217ee870fdc.tar.zst pw-darwin-15d3ceac1979629648a7e3eaf5711217ee870fdc.zip |
Stop pw(8) from segfaulting when given certain input
PR:187310
Submitted by: Kim Shrier
Obtained from: bug
MFC after: 1 week
Diffstat (limited to 'pw/pw_group.c')
-rw-r--r-- | pw/pw_group.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/pw/pw_group.c b/pw/pw_group.c index 3259412..391e477 100644 --- a/pw/pw_group.c +++ b/pw/pw_group.c @@ -227,10 +227,12 @@ pw_group(struct userconf * cnf, int mode, struct cargs * args) else if (arg->ch == 'm') { int k = 0; - while (grp->gr_mem[k] != NULL) { - if (extendarray(&members, &grmembers, i + 2) != -1) - members[i++] = grp->gr_mem[k]; - k++; + if (grp->gr_mem != NULL) { + while (grp->gr_mem[k] != NULL) { + if (extendarray(&members, &grmembers, i + 2) != -1) + members[i++] = grp->gr_mem[k]; + k++; + } } } @@ -311,6 +313,9 @@ delete_members(char ***members, int *grmembers, int *i, struct carg *arg, int k; struct passwd *pwd; + if (grp->gr_mem == NULL) + return; + k = 0; while (grp->gr_mem[k] != NULL) { matchFound = false; @@ -415,8 +420,10 @@ print_group(struct group * grp, int pretty) printf("Group Name: %-15s #%lu\n" " Members: ", grp->gr_name, (long) grp->gr_gid); - for (i = 0; grp->gr_mem[i]; i++) - printf("%s%s", i ? "," : "", grp->gr_mem[i]); + if (grp->gr_mem != NULL) { + for (i = 0; grp->gr_mem[i]; i++) + printf("%s%s", i ? "," : "", grp->gr_mem[i]); + } fputs("\n\n", stdout); } return EXIT_SUCCESS; |