| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssh/src/groupaccess.c | 
| Source code | Switch to Preprocessed file | 
| Line | Source | Count | ||||||
|---|---|---|---|---|---|---|---|---|
| 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 | - | |||||||
| 42 | static int ngroups; | - | ||||||
| 43 | static 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 | */ | - | ||||||
| 49 | int | - | ||||||
| 50 | ga_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) 
 | 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)); 
 | 0 | ||||||
| 62 | #endif | - | ||||||
| 63 | - | |||||||
| 64 | groups_bygid = xcalloc(ngroups, sizeof(*groups_bygid)); | - | ||||||
| 65 | while (getgrouplist(user, base, groups_bygid, &ngroups) == -1) { 
 | 0 | ||||||
| 66 | if (retry++ > 0) 
 | 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++) 
 | 0 | ||||||
| 74 | if ((gr = getgrgid(groups_bygid[i])) != NULL) 
 | 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 | */ | - | ||||||
| 84 | int | - | ||||||
| 85 | ga_match(char * const *groups, int n) | - | ||||||
| 86 | { | - | ||||||
| 87 | int i, j; | - | ||||||
| 88 | - | |||||||
| 89 | for (i = 0; i < ngroups; i++) 
 | 0 | ||||||
| 90 | for (j = 0; j < n; j++) 
 | 0 | ||||||
| 91 | if (match_pattern(groups_byname[i], groups[j])) 
 | 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 | */ | - | ||||||
| 100 | int | - | ||||||
| 101 | ga_match_pattern_list(const char *group_pattern) | - | ||||||
| 102 | { | - | ||||||
| 103 | int i, found = 0; | - | ||||||
| 104 | - | |||||||
| 105 | for (i = 0; i < ngroups; i++) { 
 | 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 | */ | - | ||||||
| 121 | void | - | ||||||
| 122 | ga_free(void) | - | ||||||
| 123 | { | - | ||||||
| 124 | int i; | - | ||||||
| 125 | - | |||||||
| 126 | if (ngroups > 0) { 
 | 0 | ||||||
| 127 | for (i = 0; i < ngroups; i++) 
 | 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 code | Switch to Preprocessed file |