summaryrefslogtreecommitdiff
path: root/groupaccess.c
diff options
context:
space:
mode:
authorAlistair Delva <adelva@google.com>2020-08-21 00:00:13 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2020-08-21 00:00:13 +0000
commited358b3546c776c1c677fd88eb8f716cf6187510 (patch)
tree3c6134bcb2cda4b9dccc57b4a8b997a945aab62d /groupaccess.c
parent22246b08952d746a7cc5a292570636cf4277598f (diff)
parent44a1065de8a58c51a021243a28bfa01e87822e4f (diff)
Merge changes I934c73d4,I28cdc9a0,I9e734da9,I3c079d86
* changes: UPSTREAM: depend UPSTREAM: upstream: avoid possible NULL deref; from Pedro Martelletto Revert "upstream: fix compilation with DEBUG_KEXDH; bz#3160 ok dtucker@" Merge upstream-master into master
Diffstat (limited to 'groupaccess.c')
-rw-r--r--groupaccess.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/groupaccess.c b/groupaccess.c
index 87ce4e40..80d30191 100644
--- a/groupaccess.c
+++ b/groupaccess.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: groupaccess.c,v 1.15 2015/01/20 23:14:00 deraadt Exp $ */
+/* $OpenBSD: groupaccess.c,v 1.17 2019/03/06 22:14:23 dtucker Exp $ */
/*
* Copyright (c) 2001 Kevin Steves. All rights reserved.
*
@@ -49,12 +49,8 @@ static char **groups_byname;
int
ga_init(const char *user, gid_t base)
{
-#if defined(ANDROID)
- return 0;
-#else
-
gid_t *groups_bygid;
- int i, j;
+ int i, j, retry = 0;
struct group *gr;
if (ngroups > 0)
@@ -66,16 +62,19 @@ ga_init(const char *user, gid_t base)
#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");
+ groups_bygid = xreallocarray(groups_bygid, ngroups,
+ sizeof(*groups_bygid));
+ }
groups_byname = xcalloc(ngroups, sizeof(*groups_byname));
- if (getgrouplist(user, base, groups_bygid, &ngroups) == -1)
- logit("getgrouplist: groups list too small");
for (i = 0, j = 0; i < ngroups; i++)
if ((gr = getgrgid(groups_bygid[i])) != NULL)
groups_byname[j++] = xstrdup(gr->gr_name);
free(groups_bygid);
return (ngroups = j);
-#endif
}
/*
@@ -102,11 +101,10 @@ int
ga_match_pattern_list(const char *group_pattern)
{
int i, found = 0;
- size_t len = strlen(group_pattern);
for (i = 0; i < ngroups; i++) {
- switch (match_pattern_list(groups_byname[i],
- group_pattern, len, 0)) {
+ switch (match_usergroup_pattern_list(groups_byname[i],
+ group_pattern)) {
case -1:
return 0; /* Negated match wins */
case 0:
@@ -131,5 +129,6 @@ ga_free(void)
free(groups_byname[i]);
ngroups = 0;
free(groups_byname);
+ groups_byname = NULL;
}
}