OpenCoverage

groupaccess.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssh/src/groupaccess.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: groupaccess.c,v 1.16 2015/05/04 06:10:48 djm Exp $ */-
2/*-
3 * Copyright (c) 2001 Kevin Steves. All rights reserved.-
4 *-
5 * Redistribution and use in source and binary forms, with or without-
6 * modification, are permitted provided that the following conditions-
7 * are met:-
8 * 1. Redistributions of source code must retain the above copyright-
9 * notice, this list of conditions and the following disclaimer.-
10 * 2. Redistributions in binary form must reproduce the above copyright-
11 * notice, this list of conditions and the following disclaimer in the-
12 * documentation and/or other materials provided with the distribution.-
13 *-
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR-
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES-
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.-
17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,-
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT-
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,-
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY-
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT-
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF-
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.-
24 */-
25-
26#include "includes.h"-
27-
28#include <sys/types.h>-
29-
30#include <grp.h>-
31#include <unistd.h>-
32#include <stdarg.h>-
33#include <stdlib.h>-
34#include <string.h>-
35#include <limits.h>-
36-
37#include "xmalloc.h"-
38#include "groupaccess.h"-
39#include "match.h"-
40#include "log.h"-
41-
42static int ngroups;-
43static char **groups_byname;-
44-
45/*-
46 * Initialize group access list for user with primary (base) and-
47 * supplementary groups. Return the number of groups in the list.-
48 */-
49int-
50ga_init(const char *user, gid_t base)-
51{-
52 gid_t *groups_bygid;-
53 int i, j, retry = 0;-
54 struct group *gr;-
55-
56 if (ngroups > 0)
ngroups > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
57 ga_free();
never executed: ga_free();
0
58-
59 ngroups = NGROUPS_MAX;-
60#if defined(HAVE_SYSCONF) && defined(_SC_NGROUPS_MAX)-
61 ngroups = MAX(NGROUPS_MAX, sysconf(_SC_NGROUPS_MAX));
((65536)>( sys...ROUPS_MAX ) ))Description
TRUEnever evaluated
FALSEnever evaluated
0
62#endif-
63-
64 groups_bygid = xcalloc(ngroups, sizeof(*groups_bygid));-
65 while (getgrouplist(user, base, groups_bygid, &ngroups) == -1) {
getgrouplist(u...ngroups) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
66 if (retry++ > 0)
retry++ > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
67 fatal("getgrouplist: groups list too small");
never executed: fatal("getgrouplist: groups list too small");
0
68 groups_bygid = xreallocarray(groups_bygid, ngroups,-
69 sizeof(*groups_bygid));-
70 }
never executed: end of block
0
71 groups_byname = xcalloc(ngroups, sizeof(*groups_byname));-
72-
73 for (i = 0, j = 0; i < ngroups; i++)
i < ngroupsDescription
TRUEnever evaluated
FALSEnever evaluated
0
74 if ((gr = getgrgid(groups_bygid[i])) != NULL)
(gr = getgrgid...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
75 groups_byname[j++] = xstrdup(gr->gr_name);
never executed: groups_byname[j++] = xstrdup(gr->gr_name);
0
76 free(groups_bygid);-
77 return (ngroups = j);
never executed: return (ngroups = j);
0
78}-
79-
80/*-
81 * Return 1 if one of user's groups is contained in groups.-
82 * Return 0 otherwise. Use match_pattern() for string comparison.-
83 */-
84int-
85ga_match(char * const *groups, int n)-
86{-
87 int i, j;-
88-
89 for (i = 0; i < ngroups; i++)
i < ngroupsDescription
TRUEnever evaluated
FALSEnever evaluated
0
90 for (j = 0; j < n; j++)
j < nDescription
TRUEnever evaluated
FALSEnever evaluated
0
91 if (match_pattern(groups_byname[i], groups[j]))
match_pattern(...i], groups[j])Description
TRUEnever evaluated
FALSEnever evaluated
0
92 return 1;
never executed: return 1;
0
93 return 0;
never executed: return 0;
0
94}-
95-
96/*-
97 * Return 1 if one of user's groups matches group_pattern list.-
98 * Return 0 on negated or no match.-
99 */-
100int-
101ga_match_pattern_list(const char *group_pattern)-
102{-
103 int i, found = 0;-
104-
105 for (i = 0; i < ngroups; i++) {
i < ngroupsDescription
TRUEnever evaluated
FALSEnever evaluated
0
106 switch (match_pattern_list(groups_byname[i], group_pattern, 0)) {-
107 case -1:
never executed: case -1:
0
108 return 0; /* Negated match wins */
never executed: return 0;
0
109 case 0:
never executed: case 0:
0
110 continue;
never executed: continue;
0
111 case 1:
never executed: case 1:
0
112 found = 1;-
113 }
never executed: end of block
0
114 }
never executed: end of block
0
115 return found;
never executed: return found;
0
116}-
117-
118/*-
119 * Free memory allocated for group access list.-
120 */-
121void-
122ga_free(void)-
123{-
124 int i;-
125-
126 if (ngroups > 0) {
ngroups > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
127 for (i = 0; i < ngroups; i++)
i < ngroupsDescription
TRUEnever evaluated
FALSEnever evaluated
0
128 free(groups_byname[i]);
never executed: free(groups_byname[i]);
0
129 ngroups = 0;-
130 free(groups_byname);-
131 groups_byname = NULL;-
132 }
never executed: end of block
0
133}
never executed: end of block
0
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2