xref: /netbsd-src/lib/libc/posix1e/acl_perm.c (revision 9aa2a9c323eb12a08584c70d6ea91d316703d3fe)
1*9aa2a9c3Schristos /*-
2*9aa2a9c3Schristos  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*9aa2a9c3Schristos  *
4*9aa2a9c3Schristos  * Copyright (c) 2001-2002 Chris D. Faulhaber
5*9aa2a9c3Schristos  * All rights reserved.
6*9aa2a9c3Schristos  *
7*9aa2a9c3Schristos  * Redistribution and use in source and binary forms, with or without
8*9aa2a9c3Schristos  * modification, are permitted provided that the following conditions
9*9aa2a9c3Schristos  * are met:
10*9aa2a9c3Schristos  * 1. Redistributions of source code must retain the above copyright
11*9aa2a9c3Schristos  *    notice, this list of conditions and the following disclaimer.
12*9aa2a9c3Schristos  * 2. Redistributions in binary form must reproduce the above copyright
13*9aa2a9c3Schristos  *    notice, this list of conditions and the following disclaimer in the
14*9aa2a9c3Schristos  *    documentation and/or other materials provided with the distribution.
15*9aa2a9c3Schristos  *
16*9aa2a9c3Schristos  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*9aa2a9c3Schristos  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*9aa2a9c3Schristos  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*9aa2a9c3Schristos  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
20*9aa2a9c3Schristos  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*9aa2a9c3Schristos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*9aa2a9c3Schristos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*9aa2a9c3Schristos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*9aa2a9c3Schristos  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*9aa2a9c3Schristos  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*9aa2a9c3Schristos  * SUCH DAMAGE.
27*9aa2a9c3Schristos  */
28*9aa2a9c3Schristos 
29*9aa2a9c3Schristos #include <sys/cdefs.h>
30*9aa2a9c3Schristos #if 0
31*9aa2a9c3Schristos __FBSDID("$FreeBSD: head/lib/libc/posix1e/acl_perm.c 326193 2017-11-25 17:12:48Z pfg $");
32*9aa2a9c3Schristos #else
33*9aa2a9c3Schristos __RCSID("$NetBSD: acl_perm.c,v 1.1 2020/05/16 18:31:47 christos Exp $");
34*9aa2a9c3Schristos #endif
35*9aa2a9c3Schristos 
36*9aa2a9c3Schristos #include "namespace.h"
37*9aa2a9c3Schristos #include <sys/types.h>
38*9aa2a9c3Schristos #include <sys/acl.h>
39*9aa2a9c3Schristos 
40*9aa2a9c3Schristos #include <errno.h>
41*9aa2a9c3Schristos #include <string.h>
42*9aa2a9c3Schristos 
43*9aa2a9c3Schristos static int
_perm_is_invalid(acl_perm_t perm)44*9aa2a9c3Schristos _perm_is_invalid(acl_perm_t perm)
45*9aa2a9c3Schristos {
46*9aa2a9c3Schristos 
47*9aa2a9c3Schristos 	/* Check if more than a single bit is set. */
48*9aa2a9c3Schristos 	if ((perm & -perm) == perm &&
49*9aa2a9c3Schristos 	    (perm & (ACL_POSIX1E_BITS | ACL_NFS4_PERM_BITS)) == perm)
50*9aa2a9c3Schristos 		return (0);
51*9aa2a9c3Schristos 
52*9aa2a9c3Schristos 	errno = EINVAL;
53*9aa2a9c3Schristos 
54*9aa2a9c3Schristos 	return (1);
55*9aa2a9c3Schristos }
56*9aa2a9c3Schristos 
57*9aa2a9c3Schristos /*
58*9aa2a9c3Schristos  * acl_add_perm() (23.4.1): add the permission contained in perm to the
59*9aa2a9c3Schristos  * permission set permset_d
60*9aa2a9c3Schristos  */
61*9aa2a9c3Schristos int
acl_add_perm(acl_permset_t permset_d,acl_perm_t perm)62*9aa2a9c3Schristos acl_add_perm(acl_permset_t permset_d, acl_perm_t perm)
63*9aa2a9c3Schristos {
64*9aa2a9c3Schristos 
65*9aa2a9c3Schristos 	if (permset_d == NULL) {
66*9aa2a9c3Schristos 		errno = EINVAL;
67*9aa2a9c3Schristos 		return (-1);
68*9aa2a9c3Schristos 	}
69*9aa2a9c3Schristos 
70*9aa2a9c3Schristos 	if (_perm_is_invalid(perm))
71*9aa2a9c3Schristos 		return (-1);
72*9aa2a9c3Schristos 
73*9aa2a9c3Schristos 	*permset_d |= perm;
74*9aa2a9c3Schristos 
75*9aa2a9c3Schristos 	return (0);
76*9aa2a9c3Schristos }
77*9aa2a9c3Schristos 
78*9aa2a9c3Schristos /*
79*9aa2a9c3Schristos  * acl_clear_perms() (23.4.3): clear all permisions from the permission
80*9aa2a9c3Schristos  * set permset_d
81*9aa2a9c3Schristos  */
82*9aa2a9c3Schristos int
acl_clear_perms(acl_permset_t permset_d)83*9aa2a9c3Schristos acl_clear_perms(acl_permset_t permset_d)
84*9aa2a9c3Schristos {
85*9aa2a9c3Schristos 
86*9aa2a9c3Schristos 	if (permset_d == NULL) {
87*9aa2a9c3Schristos 		errno = EINVAL;
88*9aa2a9c3Schristos 		return (-1);
89*9aa2a9c3Schristos 	}
90*9aa2a9c3Schristos 
91*9aa2a9c3Schristos 	*permset_d = ACL_PERM_NONE;
92*9aa2a9c3Schristos 
93*9aa2a9c3Schristos 	return (0);
94*9aa2a9c3Schristos }
95*9aa2a9c3Schristos 
96*9aa2a9c3Schristos /*
97*9aa2a9c3Schristos  * acl_delete_perm() (23.4.10): remove the permission in perm from the
98*9aa2a9c3Schristos  * permission set permset_d
99*9aa2a9c3Schristos  */
100*9aa2a9c3Schristos int
acl_delete_perm(acl_permset_t permset_d,acl_perm_t perm)101*9aa2a9c3Schristos acl_delete_perm(acl_permset_t permset_d, acl_perm_t perm)
102*9aa2a9c3Schristos {
103*9aa2a9c3Schristos 
104*9aa2a9c3Schristos 	if (permset_d == NULL) {
105*9aa2a9c3Schristos 		errno = EINVAL;
106*9aa2a9c3Schristos 		return (-1);
107*9aa2a9c3Schristos 	}
108*9aa2a9c3Schristos 
109*9aa2a9c3Schristos 	if (_perm_is_invalid(perm))
110*9aa2a9c3Schristos 		return (-1);
111*9aa2a9c3Schristos 
112*9aa2a9c3Schristos 	*permset_d &= ~perm;
113*9aa2a9c3Schristos 
114*9aa2a9c3Schristos 	return (0);
115*9aa2a9c3Schristos }
116*9aa2a9c3Schristos 
117*9aa2a9c3Schristos int
acl_get_perm_np(acl_permset_t permset_d,acl_perm_t perm)118*9aa2a9c3Schristos acl_get_perm_np(acl_permset_t permset_d, acl_perm_t perm)
119*9aa2a9c3Schristos {
120*9aa2a9c3Schristos 
121*9aa2a9c3Schristos 	if (permset_d == NULL) {
122*9aa2a9c3Schristos 		errno = EINVAL;
123*9aa2a9c3Schristos 		return (-1);
124*9aa2a9c3Schristos 	}
125*9aa2a9c3Schristos 
126*9aa2a9c3Schristos 	if (_perm_is_invalid(perm))
127*9aa2a9c3Schristos 		return (-1);
128*9aa2a9c3Schristos 
129*9aa2a9c3Schristos 	if (*permset_d & perm)
130*9aa2a9c3Schristos 		return (1);
131*9aa2a9c3Schristos 
132*9aa2a9c3Schristos 	return (0);
133*9aa2a9c3Schristos }
134