xref: /xnu-11215.81.4/security/mac_vfs.c (revision d4514f0bc1d3f944c22d92e68b646ac3fb40d452)
1*d4514f0bSApple OSS Distributions /*
2*d4514f0bSApple OSS Distributions  * Copyright (c) 2007-2016 Apple Inc. All rights reserved.
3*d4514f0bSApple OSS Distributions  *
4*d4514f0bSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*d4514f0bSApple OSS Distributions  *
6*d4514f0bSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*d4514f0bSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*d4514f0bSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*d4514f0bSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*d4514f0bSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*d4514f0bSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*d4514f0bSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*d4514f0bSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*d4514f0bSApple OSS Distributions  *
15*d4514f0bSApple OSS Distributions  * Please obtain a copy of the License at
16*d4514f0bSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*d4514f0bSApple OSS Distributions  *
18*d4514f0bSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*d4514f0bSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*d4514f0bSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*d4514f0bSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*d4514f0bSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*d4514f0bSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*d4514f0bSApple OSS Distributions  * limitations under the License.
25*d4514f0bSApple OSS Distributions  *
26*d4514f0bSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*d4514f0bSApple OSS Distributions  */
28*d4514f0bSApple OSS Distributions /*-
29*d4514f0bSApple OSS Distributions  * Copyright (c) 1999, 2000, 2001, 2002 Robert N. M. Watson
30*d4514f0bSApple OSS Distributions  * Copyright (c) 2001 Ilmar S. Habibulin
31*d4514f0bSApple OSS Distributions  * Copyright (c) 2001, 2002, 2003, 2004 Networks Associates Technology, Inc.
32*d4514f0bSApple OSS Distributions  * Copyright (c) 2005 SPARTA, Inc.
33*d4514f0bSApple OSS Distributions  *
34*d4514f0bSApple OSS Distributions  * This software was developed by Robert Watson and Ilmar Habibulin for the
35*d4514f0bSApple OSS Distributions  * TrustedBSD Project.
36*d4514f0bSApple OSS Distributions  *
37*d4514f0bSApple OSS Distributions  * This software was developed for the FreeBSD Project in part by Network
38*d4514f0bSApple OSS Distributions  * Associates Laboratories, the Security Research Division of Network
39*d4514f0bSApple OSS Distributions  * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"),
40*d4514f0bSApple OSS Distributions  * as part of the DARPA CHATS research program.
41*d4514f0bSApple OSS Distributions  *
42*d4514f0bSApple OSS Distributions  * Redistribution and use in source and binary forms, with or without
43*d4514f0bSApple OSS Distributions  * modification, are permitted provided that the following conditions
44*d4514f0bSApple OSS Distributions  * are met:
45*d4514f0bSApple OSS Distributions  * 1. Redistributions of source code must retain the above copyright
46*d4514f0bSApple OSS Distributions  *    notice, this list of conditions and the following disclaimer.
47*d4514f0bSApple OSS Distributions  * 2. Redistributions in binary form must reproduce the above copyright
48*d4514f0bSApple OSS Distributions  *    notice, this list of conditions and the following disclaimer in the
49*d4514f0bSApple OSS Distributions  *    documentation and/or other materials provided with the distribution.
50*d4514f0bSApple OSS Distributions  *
51*d4514f0bSApple OSS Distributions  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
52*d4514f0bSApple OSS Distributions  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
53*d4514f0bSApple OSS Distributions  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
54*d4514f0bSApple OSS Distributions  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
55*d4514f0bSApple OSS Distributions  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56*d4514f0bSApple OSS Distributions  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
57*d4514f0bSApple OSS Distributions  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
58*d4514f0bSApple OSS Distributions  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
59*d4514f0bSApple OSS Distributions  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
60*d4514f0bSApple OSS Distributions  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
61*d4514f0bSApple OSS Distributions  * SUCH DAMAGE.
62*d4514f0bSApple OSS Distributions  *
63*d4514f0bSApple OSS Distributions  */
64*d4514f0bSApple OSS Distributions 
65*d4514f0bSApple OSS Distributions #include <kern/kalloc.h>
66*d4514f0bSApple OSS Distributions #include <libkern/OSAtomic.h>
67*d4514f0bSApple OSS Distributions 
68*d4514f0bSApple OSS Distributions #include <sys/param.h>
69*d4514f0bSApple OSS Distributions #include <sys/systm.h>
70*d4514f0bSApple OSS Distributions #include <sys/kernel.h>
71*d4514f0bSApple OSS Distributions #include <sys/proc.h>
72*d4514f0bSApple OSS Distributions #include <sys/kauth.h>
73*d4514f0bSApple OSS Distributions 
74*d4514f0bSApple OSS Distributions #include <sys/file_internal.h>
75*d4514f0bSApple OSS Distributions #include <sys/imgact.h>
76*d4514f0bSApple OSS Distributions #include <sys/namei.h>
77*d4514f0bSApple OSS Distributions #include <sys/mount_internal.h>
78*d4514f0bSApple OSS Distributions #include <sys/pipe.h>
79*d4514f0bSApple OSS Distributions #include <sys/posix_sem.h>
80*d4514f0bSApple OSS Distributions #include <sys/posix_shm.h>
81*d4514f0bSApple OSS Distributions #include <sys/reason.h>
82*d4514f0bSApple OSS Distributions #include <sys/uio_internal.h>
83*d4514f0bSApple OSS Distributions #include <sys/vnode_internal.h>
84*d4514f0bSApple OSS Distributions #include <sys/kdebug.h>
85*d4514f0bSApple OSS Distributions 
86*d4514f0bSApple OSS Distributions 
87*d4514f0bSApple OSS Distributions #include <miscfs/devfs/devfsdefs.h>
88*d4514f0bSApple OSS Distributions #include <miscfs/devfs/fdesc.h>
89*d4514f0bSApple OSS Distributions 
90*d4514f0bSApple OSS Distributions #include <security/mac_internal.h>
91*d4514f0bSApple OSS Distributions 
92*d4514f0bSApple OSS Distributions /* convert {R,W,X}_OK values to V{READ,WRITE,EXEC} */
93*d4514f0bSApple OSS Distributions #define ACCESS_MODE_TO_VNODE_MASK(m)    (m << 6)
94*d4514f0bSApple OSS Distributions 
95*d4514f0bSApple OSS Distributions 
96*d4514f0bSApple OSS Distributions /*
97*d4514f0bSApple OSS Distributions  * Optional tracing of policy operations. Define VFS_TRACE_POLICY_OPS to trace the operations.
98*d4514f0bSApple OSS Distributions  *
99*d4514f0bSApple OSS Distributions  * Along with DBG_FSYSTEM and DBG_VFS, dcode in the macros below is used to construct
100*d4514f0bSApple OSS Distributions  * KDBG_EVENTID(DBG_FSYSTEM, DBG_VFS, dcode) global event id, see bsd/sys/kdebug.h.
101*d4514f0bSApple OSS Distributions  * Note that dcode is multiplied by 4 and ORed as part of the construction. See bsd/kern/trace_codes
102*d4514f0bSApple OSS Distributions  * for list of system-wide {global event id, name} pairs. Currently DBG_VFS event ids are in range
103*d4514f0bSApple OSS Distributions  * [0x3130000, 0x3130188].
104*d4514f0bSApple OSS Distributions  */
105*d4514f0bSApple OSS Distributions 
106*d4514f0bSApple OSS Distributions //#define VFS_TRACE_POLICY_OPS
107*d4514f0bSApple OSS Distributions 
108*d4514f0bSApple OSS Distributions #ifdef VFS_TRACE_POLICY_OPS
109*d4514f0bSApple OSS Distributions #define DBG_VFS_CODE(dcode)                     FSDBG_CODE(DBG_VFS, dcode)
110*d4514f0bSApple OSS Distributions #define VFS_KERNEL_DEBUG_START0(dcode)          KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_START, 0, 0, 0, 0, 0)
111*d4514f0bSApple OSS Distributions #define VFS_KERNEL_DEBUG_END0(dcode)            KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_END, 0, 0, 0, 0, 0)
112*d4514f0bSApple OSS Distributions #define VFS_KERNEL_DEBUG_START1(dcode, darg)    KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_START, darg, 0, 0, 0, 0)
113*d4514f0bSApple OSS Distributions #define VFS_KERNEL_DEBUG_END1(dcode, darg)      KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_END, darg, 0, 0, 0, 0)
114*d4514f0bSApple OSS Distributions #else
115*d4514f0bSApple OSS Distributions #define VFS_KERNEL_DEBUG_START0(dcode)          do {} while (0)
116*d4514f0bSApple OSS Distributions #define VFS_KERNEL_DEBUG_END0(dcode)            do {} while (0)
117*d4514f0bSApple OSS Distributions #define VFS_KERNEL_DEBUG_START1(dcode, darg)    do {} while (0)
118*d4514f0bSApple OSS Distributions #define VFS_KERNEL_DEBUG_END1(dcode, darg)      do {} while (0)
119*d4514f0bSApple OSS Distributions #endif
120*d4514f0bSApple OSS Distributions 
121*d4514f0bSApple OSS Distributions void
mac_devfs_label_init(struct devnode * de)122*d4514f0bSApple OSS Distributions mac_devfs_label_init(struct devnode *de)
123*d4514f0bSApple OSS Distributions {
124*d4514f0bSApple OSS Distributions 	mac_labelzone_alloc_owned(&de->dn_label, MAC_WAITOK, ^(struct label *label) {
125*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_START0(0);
126*d4514f0bSApple OSS Distributions 		MAC_PERFORM(devfs_label_init, label);
127*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_END0(0);
128*d4514f0bSApple OSS Distributions 	});
129*d4514f0bSApple OSS Distributions }
130*d4514f0bSApple OSS Distributions 
131*d4514f0bSApple OSS Distributions struct label *
mac_devfs_label(struct devnode * de)132*d4514f0bSApple OSS Distributions mac_devfs_label(struct devnode *de)
133*d4514f0bSApple OSS Distributions {
134*d4514f0bSApple OSS Distributions 	return mac_label_verify(&de->dn_label);
135*d4514f0bSApple OSS Distributions }
136*d4514f0bSApple OSS Distributions 
137*d4514f0bSApple OSS Distributions void
mac_devfs_label_destroy(struct devnode * de)138*d4514f0bSApple OSS Distributions mac_devfs_label_destroy(struct devnode *de)
139*d4514f0bSApple OSS Distributions {
140*d4514f0bSApple OSS Distributions 	mac_labelzone_free_owned(&de->dn_label, ^(struct label *label) {
141*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_START1(3, label);
142*d4514f0bSApple OSS Distributions 		MAC_PERFORM(devfs_label_destroy, label);
143*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(3, label);
144*d4514f0bSApple OSS Distributions 	});
145*d4514f0bSApple OSS Distributions }
146*d4514f0bSApple OSS Distributions 
147*d4514f0bSApple OSS Distributions void
mac_mount_label_init(struct mount * mp)148*d4514f0bSApple OSS Distributions mac_mount_label_init(struct mount *mp)
149*d4514f0bSApple OSS Distributions {
150*d4514f0bSApple OSS Distributions 	mac_labelzone_alloc_owned(&mp->mnt_mntlabel, MAC_WAITOK, ^(struct label *label) {
151*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_START0(1);
152*d4514f0bSApple OSS Distributions 		MAC_PERFORM(mount_label_init, label);
153*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_END0(1);
154*d4514f0bSApple OSS Distributions 	});
155*d4514f0bSApple OSS Distributions }
156*d4514f0bSApple OSS Distributions 
157*d4514f0bSApple OSS Distributions struct label *
mac_mount_label(struct mount * mp)158*d4514f0bSApple OSS Distributions mac_mount_label(struct mount *mp)
159*d4514f0bSApple OSS Distributions {
160*d4514f0bSApple OSS Distributions 	return mac_label_verify(&mp->mnt_mntlabel);
161*d4514f0bSApple OSS Distributions }
162*d4514f0bSApple OSS Distributions 
163*d4514f0bSApple OSS Distributions void
mac_mount_label_destroy(struct mount * mp)164*d4514f0bSApple OSS Distributions mac_mount_label_destroy(struct mount *mp)
165*d4514f0bSApple OSS Distributions {
166*d4514f0bSApple OSS Distributions 	mac_labelzone_free_owned(&mp->mnt_mntlabel, ^(struct label *label) {
167*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_START1(4, label);
168*d4514f0bSApple OSS Distributions 		MAC_PERFORM(mount_label_destroy, label);
169*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(4, label);
170*d4514f0bSApple OSS Distributions 	});
171*d4514f0bSApple OSS Distributions }
172*d4514f0bSApple OSS Distributions 
173*d4514f0bSApple OSS Distributions struct label *
mac_vnode_label_alloc(vnode_t vp)174*d4514f0bSApple OSS Distributions mac_vnode_label_alloc(vnode_t vp)
175*d4514f0bSApple OSS Distributions {
176*d4514f0bSApple OSS Distributions 	return mac_labelzone_alloc_for_owner(vp ? &vp->v_label : NULL, MAC_WAITOK, ^(struct label *label) {
177*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_START0(2);
178*d4514f0bSApple OSS Distributions 		MAC_PERFORM(vnode_label_init, label);
179*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_END0(2);
180*d4514f0bSApple OSS Distributions 		OSIncrementAtomic(&mac_vnode_label_count);
181*d4514f0bSApple OSS Distributions 	});
182*d4514f0bSApple OSS Distributions }
183*d4514f0bSApple OSS Distributions 
184*d4514f0bSApple OSS Distributions void
mac_vnode_label_init(vnode_t vp)185*d4514f0bSApple OSS Distributions mac_vnode_label_init(vnode_t vp)
186*d4514f0bSApple OSS Distributions {
187*d4514f0bSApple OSS Distributions 	struct label *label;
188*d4514f0bSApple OSS Distributions 
189*d4514f0bSApple OSS Distributions 	label = mac_vnode_label_alloc(vp);
190*d4514f0bSApple OSS Distributions 	vp->v_label = label;
191*d4514f0bSApple OSS Distributions }
192*d4514f0bSApple OSS Distributions 
193*d4514f0bSApple OSS Distributions struct label *
mac_vnode_label(vnode_t vp)194*d4514f0bSApple OSS Distributions mac_vnode_label(vnode_t vp)
195*d4514f0bSApple OSS Distributions {
196*d4514f0bSApple OSS Distributions 	return mac_label_verify(&vp->v_label);
197*d4514f0bSApple OSS Distributions }
198*d4514f0bSApple OSS Distributions 
199*d4514f0bSApple OSS Distributions static void
mac_vnode_label_cleanup(struct label * label)200*d4514f0bSApple OSS Distributions mac_vnode_label_cleanup(struct label *label)
201*d4514f0bSApple OSS Distributions {
202*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(5, label);
203*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_label_destroy, label);
204*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(5, label);
205*d4514f0bSApple OSS Distributions 	OSDecrementAtomic(&mac_vnode_label_count);
206*d4514f0bSApple OSS Distributions }
207*d4514f0bSApple OSS Distributions 
208*d4514f0bSApple OSS Distributions void
mac_vnode_label_free(struct label * label)209*d4514f0bSApple OSS Distributions mac_vnode_label_free(struct label *label)
210*d4514f0bSApple OSS Distributions {
211*d4514f0bSApple OSS Distributions 	if (label != NULL) {
212*d4514f0bSApple OSS Distributions 		mac_vnode_label_cleanup(label);
213*d4514f0bSApple OSS Distributions 		mac_labelzone_free(label);
214*d4514f0bSApple OSS Distributions 	}
215*d4514f0bSApple OSS Distributions }
216*d4514f0bSApple OSS Distributions 
217*d4514f0bSApple OSS Distributions void
mac_vnode_label_destroy(struct vnode * vp)218*d4514f0bSApple OSS Distributions mac_vnode_label_destroy(struct vnode *vp)
219*d4514f0bSApple OSS Distributions {
220*d4514f0bSApple OSS Distributions 	mac_labelzone_free_owned(&vp->v_label, ^(struct label *label) {
221*d4514f0bSApple OSS Distributions 		mac_vnode_label_cleanup(label);
222*d4514f0bSApple OSS Distributions 	});
223*d4514f0bSApple OSS Distributions }
224*d4514f0bSApple OSS Distributions 
225*d4514f0bSApple OSS Distributions int
mac_vnode_label_init_needed(vnode_t vp)226*d4514f0bSApple OSS Distributions mac_vnode_label_init_needed(vnode_t vp)
227*d4514f0bSApple OSS Distributions {
228*d4514f0bSApple OSS Distributions #if CONFIG_MACF_LAZY_VNODE_LABELS
229*d4514f0bSApple OSS Distributions 	(void)vp;
230*d4514f0bSApple OSS Distributions 	return false;
231*d4514f0bSApple OSS Distributions #else
232*d4514f0bSApple OSS Distributions 	return mac_label_vnodes != 0 && mac_vnode_label(vp) == NULL;
233*d4514f0bSApple OSS Distributions #endif
234*d4514f0bSApple OSS Distributions }
235*d4514f0bSApple OSS Distributions 
236*d4514f0bSApple OSS Distributions struct label *
mac_vnode_label_allocate(vnode_t vp)237*d4514f0bSApple OSS Distributions mac_vnode_label_allocate(vnode_t vp)
238*d4514f0bSApple OSS Distributions {
239*d4514f0bSApple OSS Distributions 	if (mac_vnode_label_init_needed(vp)) {
240*d4514f0bSApple OSS Distributions 		mac_vnode_label_init(vp);
241*d4514f0bSApple OSS Distributions 	}
242*d4514f0bSApple OSS Distributions 	return mac_vnode_label(vp);
243*d4514f0bSApple OSS Distributions }
244*d4514f0bSApple OSS Distributions 
245*d4514f0bSApple OSS Distributions /*
246*d4514f0bSApple OSS Distributions  * vnode labels are allocated at the same time as vnodes, but vnodes are never
247*d4514f0bSApple OSS Distributions  * freed.  Instead, we want to remove any sensitive information before putting
248*d4514f0bSApple OSS Distributions  * them on the free list for reuse.
249*d4514f0bSApple OSS Distributions  */
250*d4514f0bSApple OSS Distributions void
mac_vnode_label_recycle(vnode_t vp)251*d4514f0bSApple OSS Distributions mac_vnode_label_recycle(vnode_t vp)
252*d4514f0bSApple OSS Distributions {
253*d4514f0bSApple OSS Distributions 	struct label *v_label = mac_vnode_label(vp);
254*d4514f0bSApple OSS Distributions 
255*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_label_recycle, v_label);
256*d4514f0bSApple OSS Distributions #if CONFIG_MACF_LAZY_VNODE_LABELS
257*d4514f0bSApple OSS Distributions 	if (v_label) {
258*d4514f0bSApple OSS Distributions 		mac_vnode_label_destroy(vp);
259*d4514f0bSApple OSS Distributions 		vp->v_lflag &= ~VL_LABELED;
260*d4514f0bSApple OSS Distributions 	}
261*d4514f0bSApple OSS Distributions #endif
262*d4514f0bSApple OSS Distributions }
263*d4514f0bSApple OSS Distributions 
264*d4514f0bSApple OSS Distributions void
mac_vnode_label_copy(struct label * src,struct label * dest)265*d4514f0bSApple OSS Distributions mac_vnode_label_copy(struct label *src, struct label *dest)
266*d4514f0bSApple OSS Distributions {
267*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(6, src);
268*d4514f0bSApple OSS Distributions 	if (src == NULL) {
269*d4514f0bSApple OSS Distributions 		MAC_PERFORM(vnode_label_init, dest);
270*d4514f0bSApple OSS Distributions 	} else {
271*d4514f0bSApple OSS Distributions 		MAC_PERFORM(vnode_label_copy, src, dest);
272*d4514f0bSApple OSS Distributions 	}
273*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(6, src);
274*d4514f0bSApple OSS Distributions }
275*d4514f0bSApple OSS Distributions 
276*d4514f0bSApple OSS Distributions int
mac_vnode_label_externalize_audit(struct vnode * vp,struct mac * mac)277*d4514f0bSApple OSS Distributions mac_vnode_label_externalize_audit(struct vnode *vp, struct mac *mac)
278*d4514f0bSApple OSS Distributions {
279*d4514f0bSApple OSS Distributions 	int error;
280*d4514f0bSApple OSS Distributions 
281*d4514f0bSApple OSS Distributions 	/* It is assumed that any necessary vnode locking is done on entry */
282*d4514f0bSApple OSS Distributions 	error = MAC_EXTERNALIZE_AUDIT(vnode, mac_vnode_label(vp),
283*d4514f0bSApple OSS Distributions 	    mac->m_string, mac->m_buflen);
284*d4514f0bSApple OSS Distributions 
285*d4514f0bSApple OSS Distributions 	return error;
286*d4514f0bSApple OSS Distributions }
287*d4514f0bSApple OSS Distributions 
288*d4514f0bSApple OSS Distributions int
mac_vnode_label_externalize(struct label * label,char * elements,char * outbuf,size_t outbuflen,int flags __unused)289*d4514f0bSApple OSS Distributions mac_vnode_label_externalize(struct label *label, char *elements,
290*d4514f0bSApple OSS Distributions     char *outbuf, size_t outbuflen, int flags __unused)
291*d4514f0bSApple OSS Distributions {
292*d4514f0bSApple OSS Distributions 	int error;
293*d4514f0bSApple OSS Distributions 
294*d4514f0bSApple OSS Distributions 	error = MAC_EXTERNALIZE(vnode, label, elements, outbuf, outbuflen);
295*d4514f0bSApple OSS Distributions 
296*d4514f0bSApple OSS Distributions 	return error;
297*d4514f0bSApple OSS Distributions }
298*d4514f0bSApple OSS Distributions 
299*d4514f0bSApple OSS Distributions int
mac_vnode_label_internalize(struct label * label,char * string)300*d4514f0bSApple OSS Distributions mac_vnode_label_internalize(struct label *label, char *string)
301*d4514f0bSApple OSS Distributions {
302*d4514f0bSApple OSS Distributions 	int error;
303*d4514f0bSApple OSS Distributions 
304*d4514f0bSApple OSS Distributions 	error = MAC_INTERNALIZE(vnode, label, string);
305*d4514f0bSApple OSS Distributions 
306*d4514f0bSApple OSS Distributions 	return error;
307*d4514f0bSApple OSS Distributions }
308*d4514f0bSApple OSS Distributions 
309*d4514f0bSApple OSS Distributions int
mac_mount_label_internalize(struct label * label,char * string)310*d4514f0bSApple OSS Distributions mac_mount_label_internalize(struct label *label, char *string)
311*d4514f0bSApple OSS Distributions {
312*d4514f0bSApple OSS Distributions 	int error;
313*d4514f0bSApple OSS Distributions 
314*d4514f0bSApple OSS Distributions 	error = MAC_INTERNALIZE(mount, label, string);
315*d4514f0bSApple OSS Distributions 
316*d4514f0bSApple OSS Distributions 	return error;
317*d4514f0bSApple OSS Distributions }
318*d4514f0bSApple OSS Distributions 
319*d4514f0bSApple OSS Distributions int
mac_mount_label_externalize(struct label * label,char * elements,char * outbuf,size_t outbuflen)320*d4514f0bSApple OSS Distributions mac_mount_label_externalize(struct label *label, char *elements,
321*d4514f0bSApple OSS Distributions     char *outbuf, size_t outbuflen)
322*d4514f0bSApple OSS Distributions {
323*d4514f0bSApple OSS Distributions 	int error;
324*d4514f0bSApple OSS Distributions 
325*d4514f0bSApple OSS Distributions 	error = MAC_EXTERNALIZE(mount, label, elements, outbuf, outbuflen);
326*d4514f0bSApple OSS Distributions 
327*d4514f0bSApple OSS Distributions 	return error;
328*d4514f0bSApple OSS Distributions }
329*d4514f0bSApple OSS Distributions 
330*d4514f0bSApple OSS Distributions void
mac_devfs_label_copy(struct label * src,struct label * dest)331*d4514f0bSApple OSS Distributions mac_devfs_label_copy(struct label *src, struct label *dest)
332*d4514f0bSApple OSS Distributions {
333*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
334*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
335*d4514f0bSApple OSS Distributions 	if (!mac_device_enforce) {
336*d4514f0bSApple OSS Distributions 		return;
337*d4514f0bSApple OSS Distributions 	}
338*d4514f0bSApple OSS Distributions #endif
339*d4514f0bSApple OSS Distributions 
340*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(7, src);
341*d4514f0bSApple OSS Distributions 	MAC_PERFORM(devfs_label_copy, src, dest);
342*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(7, src);
343*d4514f0bSApple OSS Distributions }
344*d4514f0bSApple OSS Distributions 
345*d4514f0bSApple OSS Distributions void
mac_devfs_label_update(struct mount * mp,struct devnode * de,struct vnode * vp)346*d4514f0bSApple OSS Distributions mac_devfs_label_update(struct mount *mp, struct devnode *de,
347*d4514f0bSApple OSS Distributions     struct vnode *vp)
348*d4514f0bSApple OSS Distributions {
349*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
350*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
351*d4514f0bSApple OSS Distributions 	if (!mac_device_enforce) {
352*d4514f0bSApple OSS Distributions 		return;
353*d4514f0bSApple OSS Distributions 	}
354*d4514f0bSApple OSS Distributions #endif
355*d4514f0bSApple OSS Distributions 
356*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(8, vp);
357*d4514f0bSApple OSS Distributions 	MAC_PERFORM(devfs_label_update, mp, de, mac_devfs_label(de), vp,
358*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp));
359*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(8, vp);
360*d4514f0bSApple OSS Distributions }
361*d4514f0bSApple OSS Distributions 
362*d4514f0bSApple OSS Distributions int
mac_vnode_label_associate(struct mount * mp,struct vnode * vp,vfs_context_t ctx)363*d4514f0bSApple OSS Distributions mac_vnode_label_associate(struct mount *mp, struct vnode *vp, vfs_context_t ctx)
364*d4514f0bSApple OSS Distributions {
365*d4514f0bSApple OSS Distributions 	struct devnode *dnp;
366*d4514f0bSApple OSS Distributions 	struct fdescnode *fnp;
367*d4514f0bSApple OSS Distributions 	int error = 0;
368*d4514f0bSApple OSS Distributions 
369*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
370*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
371*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
372*d4514f0bSApple OSS Distributions 		return error;
373*d4514f0bSApple OSS Distributions 	}
374*d4514f0bSApple OSS Distributions #endif
375*d4514f0bSApple OSS Distributions 
376*d4514f0bSApple OSS Distributions 	/* XXX: should not inspect v_tag in kernel! */
377*d4514f0bSApple OSS Distributions 	switch (vp->v_tag) {
378*d4514f0bSApple OSS Distributions 	case VT_DEVFS:
379*d4514f0bSApple OSS Distributions 		dnp = VTODN(vp);
380*d4514f0bSApple OSS Distributions 		mac_vnode_label_associate_devfs(mp, dnp, vp);
381*d4514f0bSApple OSS Distributions 		break;
382*d4514f0bSApple OSS Distributions 	case VT_FDESC:
383*d4514f0bSApple OSS Distributions 		fnp = VTOFDESC(vp);
384*d4514f0bSApple OSS Distributions 		error = mac_vnode_label_associate_fdesc(mp, fnp, vp, ctx);
385*d4514f0bSApple OSS Distributions 		break;
386*d4514f0bSApple OSS Distributions 	default:
387*d4514f0bSApple OSS Distributions 		error = mac_vnode_label_associate_extattr(mp, vp);
388*d4514f0bSApple OSS Distributions 		break;
389*d4514f0bSApple OSS Distributions 	}
390*d4514f0bSApple OSS Distributions 
391*d4514f0bSApple OSS Distributions 	return error;
392*d4514f0bSApple OSS Distributions }
393*d4514f0bSApple OSS Distributions 
394*d4514f0bSApple OSS Distributions void
mac_vnode_label_associate_devfs(struct mount * mp,struct devnode * de,struct vnode * vp)395*d4514f0bSApple OSS Distributions mac_vnode_label_associate_devfs(struct mount *mp, struct devnode *de,
396*d4514f0bSApple OSS Distributions     struct vnode *vp)
397*d4514f0bSApple OSS Distributions {
398*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
399*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
400*d4514f0bSApple OSS Distributions 	if (!mac_device_enforce) {
401*d4514f0bSApple OSS Distributions 		return;
402*d4514f0bSApple OSS Distributions 	}
403*d4514f0bSApple OSS Distributions #endif
404*d4514f0bSApple OSS Distributions 
405*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(9, vp);
406*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_label_associate_devfs,
407*d4514f0bSApple OSS Distributions 	    mp, mp ? mac_mount_label(mp) : NULL,
408*d4514f0bSApple OSS Distributions 	    de, mac_devfs_label(de),
409*d4514f0bSApple OSS Distributions 	    vp, mac_vnode_label(vp));
410*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(9, vp);
411*d4514f0bSApple OSS Distributions }
412*d4514f0bSApple OSS Distributions 
413*d4514f0bSApple OSS Distributions int
mac_vnode_label_associate_extattr(struct mount * mp,struct vnode * vp)414*d4514f0bSApple OSS Distributions mac_vnode_label_associate_extattr(struct mount *mp, struct vnode *vp)
415*d4514f0bSApple OSS Distributions {
416*d4514f0bSApple OSS Distributions 	int error;
417*d4514f0bSApple OSS Distributions 
418*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(10, vp);
419*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_label_associate_extattr, mp, mac_mount_label(mp), vp,
420*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp));
421*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(10, vp);
422*d4514f0bSApple OSS Distributions 
423*d4514f0bSApple OSS Distributions 	return error;
424*d4514f0bSApple OSS Distributions }
425*d4514f0bSApple OSS Distributions 
426*d4514f0bSApple OSS Distributions void
mac_vnode_label_associate_singlelabel(struct mount * mp,struct vnode * vp)427*d4514f0bSApple OSS Distributions mac_vnode_label_associate_singlelabel(struct mount *mp, struct vnode *vp)
428*d4514f0bSApple OSS Distributions {
429*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
430*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
431*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
432*d4514f0bSApple OSS Distributions 		return;
433*d4514f0bSApple OSS Distributions 	}
434*d4514f0bSApple OSS Distributions #endif
435*d4514f0bSApple OSS Distributions 	if (!mac_label_vnodes) {
436*d4514f0bSApple OSS Distributions 		return;
437*d4514f0bSApple OSS Distributions 	}
438*d4514f0bSApple OSS Distributions 
439*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(11, vp);
440*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_label_associate_singlelabel, mp,
441*d4514f0bSApple OSS Distributions 	    mp ? mac_mount_label(mp) : NULL, vp, mac_vnode_label(vp));
442*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(11, vp);
443*d4514f0bSApple OSS Distributions }
444*d4514f0bSApple OSS Distributions 
445*d4514f0bSApple OSS Distributions int
mac_vnode_notify_create(vfs_context_t ctx,struct mount * mp,struct vnode * dvp,struct vnode * vp,struct componentname * cnp)446*d4514f0bSApple OSS Distributions mac_vnode_notify_create(vfs_context_t ctx, struct mount *mp,
447*d4514f0bSApple OSS Distributions     struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
448*d4514f0bSApple OSS Distributions {
449*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
450*d4514f0bSApple OSS Distributions 	int error;
451*d4514f0bSApple OSS Distributions 
452*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
453*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
454*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
455*d4514f0bSApple OSS Distributions 		return 0;
456*d4514f0bSApple OSS Distributions 	}
457*d4514f0bSApple OSS Distributions #endif
458*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
459*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
460*d4514f0bSApple OSS Distributions 		return 0;
461*d4514f0bSApple OSS Distributions 	}
462*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(12, vp);
463*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_notify_create, cred, mp, mac_mount_label(mp),
464*d4514f0bSApple OSS Distributions 	    dvp, mac_vnode_label(dvp), vp, mac_vnode_label(vp), cnp);
465*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(12, vp);
466*d4514f0bSApple OSS Distributions 
467*d4514f0bSApple OSS Distributions 	return error;
468*d4514f0bSApple OSS Distributions }
469*d4514f0bSApple OSS Distributions 
470*d4514f0bSApple OSS Distributions void
mac_vnode_notify_rename(vfs_context_t ctx,struct vnode * fvp,struct vnode * tdvp,struct componentname * tcnp)471*d4514f0bSApple OSS Distributions mac_vnode_notify_rename(vfs_context_t ctx, struct vnode *fvp,
472*d4514f0bSApple OSS Distributions     struct vnode *tdvp, struct componentname *tcnp)
473*d4514f0bSApple OSS Distributions {
474*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
475*d4514f0bSApple OSS Distributions 
476*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
477*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
478*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
479*d4514f0bSApple OSS Distributions 		return;
480*d4514f0bSApple OSS Distributions 	}
481*d4514f0bSApple OSS Distributions #endif
482*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
483*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
484*d4514f0bSApple OSS Distributions 		return;
485*d4514f0bSApple OSS Distributions 	}
486*d4514f0bSApple OSS Distributions 
487*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(13, fvp);
488*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_rename, cred, fvp, mac_vnode_label(fvp), tdvp, mac_vnode_label(tdvp), tcnp);
489*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(13, fvp);
490*d4514f0bSApple OSS Distributions }
491*d4514f0bSApple OSS Distributions 
492*d4514f0bSApple OSS Distributions void
mac_vnode_notify_open(vfs_context_t ctx,struct vnode * vp,int acc_flags)493*d4514f0bSApple OSS Distributions mac_vnode_notify_open(vfs_context_t ctx, struct vnode *vp, int acc_flags)
494*d4514f0bSApple OSS Distributions {
495*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
496*d4514f0bSApple OSS Distributions 
497*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
498*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
499*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
500*d4514f0bSApple OSS Distributions 		return;
501*d4514f0bSApple OSS Distributions 	}
502*d4514f0bSApple OSS Distributions #endif
503*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
504*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
505*d4514f0bSApple OSS Distributions 		return;
506*d4514f0bSApple OSS Distributions 	}
507*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(14, vp);
508*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_open, cred, vp, mac_vnode_label(vp), acc_flags);
509*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(14, vp);
510*d4514f0bSApple OSS Distributions }
511*d4514f0bSApple OSS Distributions 
512*d4514f0bSApple OSS Distributions void
mac_vnode_notify_link(vfs_context_t ctx,struct vnode * vp,struct vnode * dvp,struct componentname * cnp)513*d4514f0bSApple OSS Distributions mac_vnode_notify_link(vfs_context_t ctx, struct vnode *vp,
514*d4514f0bSApple OSS Distributions     struct vnode *dvp, struct componentname *cnp)
515*d4514f0bSApple OSS Distributions {
516*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
517*d4514f0bSApple OSS Distributions 
518*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
519*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
520*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
521*d4514f0bSApple OSS Distributions 		return;
522*d4514f0bSApple OSS Distributions 	}
523*d4514f0bSApple OSS Distributions #endif
524*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
525*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
526*d4514f0bSApple OSS Distributions 		return;
527*d4514f0bSApple OSS Distributions 	}
528*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(15, vp);
529*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_link, cred, dvp, mac_vnode_label(dvp), vp, mac_vnode_label(vp), cnp);
530*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(15, vp);
531*d4514f0bSApple OSS Distributions }
532*d4514f0bSApple OSS Distributions 
533*d4514f0bSApple OSS Distributions void
mac_vnode_notify_deleteextattr(vfs_context_t ctx,struct vnode * vp,const char * name)534*d4514f0bSApple OSS Distributions mac_vnode_notify_deleteextattr(vfs_context_t ctx, struct vnode *vp, const char *name)
535*d4514f0bSApple OSS Distributions {
536*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
537*d4514f0bSApple OSS Distributions 
538*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
539*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
540*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
541*d4514f0bSApple OSS Distributions 		return;
542*d4514f0bSApple OSS Distributions 	}
543*d4514f0bSApple OSS Distributions #endif
544*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
545*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
546*d4514f0bSApple OSS Distributions 		return;
547*d4514f0bSApple OSS Distributions 	}
548*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(16, vp);
549*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_deleteextattr, cred, vp, mac_vnode_label(vp), name);
550*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(16, vp);
551*d4514f0bSApple OSS Distributions }
552*d4514f0bSApple OSS Distributions 
553*d4514f0bSApple OSS Distributions void
mac_vnode_notify_setacl(vfs_context_t ctx,struct vnode * vp,struct kauth_acl * acl)554*d4514f0bSApple OSS Distributions mac_vnode_notify_setacl(vfs_context_t ctx, struct vnode *vp, struct kauth_acl *acl)
555*d4514f0bSApple OSS Distributions {
556*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
557*d4514f0bSApple OSS Distributions 
558*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
559*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
560*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
561*d4514f0bSApple OSS Distributions 		return;
562*d4514f0bSApple OSS Distributions 	}
563*d4514f0bSApple OSS Distributions #endif
564*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
565*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
566*d4514f0bSApple OSS Distributions 		return;
567*d4514f0bSApple OSS Distributions 	}
568*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(17, vp);
569*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_setacl, cred, vp, mac_vnode_label(vp), acl);
570*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(17, vp);
571*d4514f0bSApple OSS Distributions }
572*d4514f0bSApple OSS Distributions 
573*d4514f0bSApple OSS Distributions void
mac_vnode_notify_setattrlist(vfs_context_t ctx,struct vnode * vp,struct attrlist * alist)574*d4514f0bSApple OSS Distributions mac_vnode_notify_setattrlist(vfs_context_t ctx, struct vnode *vp, struct attrlist *alist)
575*d4514f0bSApple OSS Distributions {
576*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
577*d4514f0bSApple OSS Distributions 
578*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
579*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
580*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
581*d4514f0bSApple OSS Distributions 		return;
582*d4514f0bSApple OSS Distributions 	}
583*d4514f0bSApple OSS Distributions #endif
584*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
585*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
586*d4514f0bSApple OSS Distributions 		return;
587*d4514f0bSApple OSS Distributions 	}
588*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(18, vp);
589*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_setattrlist, cred, vp, mac_vnode_label(vp), alist);
590*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(18, vp);
591*d4514f0bSApple OSS Distributions }
592*d4514f0bSApple OSS Distributions 
593*d4514f0bSApple OSS Distributions void
mac_vnode_notify_setextattr(vfs_context_t ctx,struct vnode * vp,const char * name,struct uio * uio)594*d4514f0bSApple OSS Distributions mac_vnode_notify_setextattr(vfs_context_t ctx, struct vnode *vp, const char *name, struct uio *uio)
595*d4514f0bSApple OSS Distributions {
596*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
597*d4514f0bSApple OSS Distributions 
598*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
599*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
600*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
601*d4514f0bSApple OSS Distributions 		return;
602*d4514f0bSApple OSS Distributions 	}
603*d4514f0bSApple OSS Distributions #endif
604*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
605*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
606*d4514f0bSApple OSS Distributions 		return;
607*d4514f0bSApple OSS Distributions 	}
608*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(19, vp);
609*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_setextattr, cred, vp, mac_vnode_label(vp), name, uio);
610*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(19, vp);
611*d4514f0bSApple OSS Distributions }
612*d4514f0bSApple OSS Distributions 
613*d4514f0bSApple OSS Distributions void
mac_vnode_notify_setflags(vfs_context_t ctx,struct vnode * vp,u_long flags)614*d4514f0bSApple OSS Distributions mac_vnode_notify_setflags(vfs_context_t ctx, struct vnode *vp, u_long flags)
615*d4514f0bSApple OSS Distributions {
616*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
617*d4514f0bSApple OSS Distributions 
618*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
619*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
620*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
621*d4514f0bSApple OSS Distributions 		return;
622*d4514f0bSApple OSS Distributions 	}
623*d4514f0bSApple OSS Distributions #endif
624*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
625*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
626*d4514f0bSApple OSS Distributions 		return;
627*d4514f0bSApple OSS Distributions 	}
628*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(20, vp);
629*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_setflags, cred, vp, mac_vnode_label(vp), flags);
630*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(20, vp);
631*d4514f0bSApple OSS Distributions }
632*d4514f0bSApple OSS Distributions 
633*d4514f0bSApple OSS Distributions void
mac_vnode_notify_setmode(vfs_context_t ctx,struct vnode * vp,mode_t mode)634*d4514f0bSApple OSS Distributions mac_vnode_notify_setmode(vfs_context_t ctx, struct vnode *vp, mode_t mode)
635*d4514f0bSApple OSS Distributions {
636*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
637*d4514f0bSApple OSS Distributions 
638*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
639*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
640*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
641*d4514f0bSApple OSS Distributions 		return;
642*d4514f0bSApple OSS Distributions 	}
643*d4514f0bSApple OSS Distributions #endif
644*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
645*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
646*d4514f0bSApple OSS Distributions 		return;
647*d4514f0bSApple OSS Distributions 	}
648*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(21, vp);
649*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_setmode, cred, vp, mac_vnode_label(vp), mode);
650*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(21, vp);
651*d4514f0bSApple OSS Distributions }
652*d4514f0bSApple OSS Distributions 
653*d4514f0bSApple OSS Distributions void
mac_vnode_notify_setowner(vfs_context_t ctx,struct vnode * vp,uid_t uid,gid_t gid)654*d4514f0bSApple OSS Distributions mac_vnode_notify_setowner(vfs_context_t ctx, struct vnode *vp, uid_t uid, gid_t gid)
655*d4514f0bSApple OSS Distributions {
656*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
657*d4514f0bSApple OSS Distributions 
658*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
659*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
660*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
661*d4514f0bSApple OSS Distributions 		return;
662*d4514f0bSApple OSS Distributions 	}
663*d4514f0bSApple OSS Distributions #endif
664*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
665*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
666*d4514f0bSApple OSS Distributions 		return;
667*d4514f0bSApple OSS Distributions 	}
668*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(22, vp);
669*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_setowner, cred, vp, mac_vnode_label(vp), uid, gid);
670*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(22, vp);
671*d4514f0bSApple OSS Distributions }
672*d4514f0bSApple OSS Distributions 
673*d4514f0bSApple OSS Distributions void
mac_vnode_notify_setutimes(vfs_context_t ctx,struct vnode * vp,struct timespec atime,struct timespec mtime)674*d4514f0bSApple OSS Distributions mac_vnode_notify_setutimes(vfs_context_t ctx, struct vnode *vp, struct timespec atime, struct timespec mtime)
675*d4514f0bSApple OSS Distributions {
676*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
677*d4514f0bSApple OSS Distributions 
678*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
679*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
680*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
681*d4514f0bSApple OSS Distributions 		return;
682*d4514f0bSApple OSS Distributions 	}
683*d4514f0bSApple OSS Distributions #endif
684*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
685*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
686*d4514f0bSApple OSS Distributions 		return;
687*d4514f0bSApple OSS Distributions 	}
688*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(23, vp);
689*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_setutimes, cred, vp, mac_vnode_label(vp), atime, mtime);
690*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(23, vp);
691*d4514f0bSApple OSS Distributions }
692*d4514f0bSApple OSS Distributions 
693*d4514f0bSApple OSS Distributions void
mac_vnode_notify_truncate(vfs_context_t ctx,kauth_cred_t file_cred,struct vnode * vp)694*d4514f0bSApple OSS Distributions mac_vnode_notify_truncate(vfs_context_t ctx, kauth_cred_t file_cred, struct vnode *vp)
695*d4514f0bSApple OSS Distributions {
696*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
697*d4514f0bSApple OSS Distributions 
698*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
699*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
700*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
701*d4514f0bSApple OSS Distributions 		return;
702*d4514f0bSApple OSS Distributions 	}
703*d4514f0bSApple OSS Distributions #endif
704*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
705*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
706*d4514f0bSApple OSS Distributions 		return;
707*d4514f0bSApple OSS Distributions 	}
708*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(24, vp);
709*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_truncate, cred, file_cred, vp, mac_vnode_label(vp));
710*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(24, vp);
711*d4514f0bSApple OSS Distributions }
712*d4514f0bSApple OSS Distributions 
713*d4514f0bSApple OSS Distributions /*
714*d4514f0bSApple OSS Distributions  * Extended attribute 'name' was updated via
715*d4514f0bSApple OSS Distributions  * vn_setxattr() or vn_removexattr().  Allow the
716*d4514f0bSApple OSS Distributions  * policy to update the vnode label.
717*d4514f0bSApple OSS Distributions  */
718*d4514f0bSApple OSS Distributions void
mac_vnode_label_update_extattr(struct mount * mp,struct vnode * vp,const char * name)719*d4514f0bSApple OSS Distributions mac_vnode_label_update_extattr(struct mount *mp, struct vnode *vp,
720*d4514f0bSApple OSS Distributions     const char *name)
721*d4514f0bSApple OSS Distributions {
722*d4514f0bSApple OSS Distributions 	int error = 0;
723*d4514f0bSApple OSS Distributions 
724*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
725*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
726*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
727*d4514f0bSApple OSS Distributions 		return;
728*d4514f0bSApple OSS Distributions 	}
729*d4514f0bSApple OSS Distributions #endif
730*d4514f0bSApple OSS Distributions 	if (!mac_label_vnodes) {
731*d4514f0bSApple OSS Distributions 		return;
732*d4514f0bSApple OSS Distributions 	}
733*d4514f0bSApple OSS Distributions 
734*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(25, vp);
735*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_label_update_extattr, mp, mac_mount_label(mp), vp,
736*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp), name);
737*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(25, vp);
738*d4514f0bSApple OSS Distributions 	if (error == 0) {
739*d4514f0bSApple OSS Distributions 		return;
740*d4514f0bSApple OSS Distributions 	}
741*d4514f0bSApple OSS Distributions 
742*d4514f0bSApple OSS Distributions 	vnode_lock(vp);
743*d4514f0bSApple OSS Distributions 	vnode_relabel(vp);
744*d4514f0bSApple OSS Distributions 	vnode_unlock(vp);
745*d4514f0bSApple OSS Distributions 	return;
746*d4514f0bSApple OSS Distributions }
747*d4514f0bSApple OSS Distributions 
748*d4514f0bSApple OSS Distributions static int
mac_vnode_label_store(vfs_context_t ctx,struct vnode * vp,struct label * intlabel)749*d4514f0bSApple OSS Distributions mac_vnode_label_store(vfs_context_t ctx, struct vnode *vp,
750*d4514f0bSApple OSS Distributions     struct label *intlabel)
751*d4514f0bSApple OSS Distributions {
752*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
753*d4514f0bSApple OSS Distributions 	int error;
754*d4514f0bSApple OSS Distributions 
755*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
756*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
757*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
758*d4514f0bSApple OSS Distributions 		return 0;
759*d4514f0bSApple OSS Distributions 	}
760*d4514f0bSApple OSS Distributions #endif
761*d4514f0bSApple OSS Distributions 	if (!mac_label_vnodes) {
762*d4514f0bSApple OSS Distributions 		return 0;
763*d4514f0bSApple OSS Distributions 	}
764*d4514f0bSApple OSS Distributions 
765*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
766*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
767*d4514f0bSApple OSS Distributions 		return 0;
768*d4514f0bSApple OSS Distributions 	}
769*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(26, vp);
770*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_label_store, cred, vp, mac_vnode_label(vp), intlabel);
771*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(26, vp);
772*d4514f0bSApple OSS Distributions 
773*d4514f0bSApple OSS Distributions 	return error;
774*d4514f0bSApple OSS Distributions }
775*d4514f0bSApple OSS Distributions 
776*d4514f0bSApple OSS Distributions void
mac_cred_label_update_execve(vfs_context_t ctx,kauth_cred_t new,struct vnode * vp,off_t offset,struct vnode * scriptvp,struct label * scriptvnodelabel,struct label * execl,u_int * csflags,void * macextensions,int * disjoint,int * labelupdateerror)777*d4514f0bSApple OSS Distributions mac_cred_label_update_execve(vfs_context_t ctx, kauth_cred_t new, struct vnode *vp, off_t offset,
778*d4514f0bSApple OSS Distributions     struct vnode *scriptvp, struct label *scriptvnodelabel, struct label *execl, u_int *csflags,
779*d4514f0bSApple OSS Distributions     void *macextensions, int *disjoint, int *labelupdateerror)
780*d4514f0bSApple OSS Distributions {
781*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
782*d4514f0bSApple OSS Distributions 	*disjoint = 0;
783*d4514f0bSApple OSS Distributions 	int error;
784*d4514f0bSApple OSS Distributions 	posix_cred_t pcred = posix_cred_get(new);
785*d4514f0bSApple OSS Distributions 
786*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
787*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
788*d4514f0bSApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
789*d4514f0bSApple OSS Distributions 		return;
790*d4514f0bSApple OSS Distributions 	}
791*d4514f0bSApple OSS Distributions #endif
792*d4514f0bSApple OSS Distributions 
793*d4514f0bSApple OSS Distributions 	/* mark the new cred to indicate "matching" includes the label */
794*d4514f0bSApple OSS Distributions 	pcred->cr_flags |= CRF_MAC_ENFORCE;
795*d4514f0bSApple OSS Distributions 
796*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
797*d4514f0bSApple OSS Distributions 
798*d4514f0bSApple OSS Distributions 	/*
799*d4514f0bSApple OSS Distributions 	 * NB: Cannot use MAC_CHECK macro because we need a sequence point after
800*d4514f0bSApple OSS Distributions 	 *     calling exec_spawnattr_getmacpolicyinfo() and before passing the
801*d4514f0bSApple OSS Distributions 	 *     spawnattrlen as an argument to the hook.
802*d4514f0bSApple OSS Distributions 	 */
803*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(27, vp);
804*d4514f0bSApple OSS Distributions 	{
805*d4514f0bSApple OSS Distributions 		struct mac_policy_conf *mpc;
806*d4514f0bSApple OSS Distributions 		u_int i;
807*d4514f0bSApple OSS Distributions 
808*d4514f0bSApple OSS Distributions 		error = 0;
809*d4514f0bSApple OSS Distributions 		for (i = 0; i < mac_policy_list.staticmax; i++) {
810*d4514f0bSApple OSS Distributions 			mpc = mac_policy_list.entries[i].mpc;
811*d4514f0bSApple OSS Distributions 			if (mpc == NULL) {
812*d4514f0bSApple OSS Distributions 				continue;
813*d4514f0bSApple OSS Distributions 			}
814*d4514f0bSApple OSS Distributions 
815*d4514f0bSApple OSS Distributions 			mpo_cred_label_update_execve_t *hook = mpc->mpc_ops->mpo_cred_label_update_execve;
816*d4514f0bSApple OSS Distributions 			if (hook == NULL) {
817*d4514f0bSApple OSS Distributions 				continue;
818*d4514f0bSApple OSS Distributions 			}
819*d4514f0bSApple OSS Distributions 
820*d4514f0bSApple OSS Distributions 			size_t spawnattrlen = 0;
821*d4514f0bSApple OSS Distributions 			void *spawnattr = exec_spawnattr_getmacpolicyinfo(macextensions, mpc->mpc_name, &spawnattrlen);
822*d4514f0bSApple OSS Distributions 
823*d4514f0bSApple OSS Distributions 			error = mac_error_select(hook(cred, new, vfs_context_proc(ctx), vp, offset, scriptvp,
824*d4514f0bSApple OSS Distributions 			    mac_vnode_label(vp), scriptvnodelabel, execl, csflags, spawnattr, spawnattrlen, disjoint),
825*d4514f0bSApple OSS Distributions 			    error);
826*d4514f0bSApple OSS Distributions 		}
827*d4514f0bSApple OSS Distributions 		if (mac_policy_list_conditional_busy() != 0) {
828*d4514f0bSApple OSS Distributions 			for (; i <= mac_policy_list.maxindex; i++) {
829*d4514f0bSApple OSS Distributions 				mpc = mac_policy_list.entries[i].mpc;
830*d4514f0bSApple OSS Distributions 				if (mpc == NULL) {
831*d4514f0bSApple OSS Distributions 					continue;
832*d4514f0bSApple OSS Distributions 				}
833*d4514f0bSApple OSS Distributions 
834*d4514f0bSApple OSS Distributions 				mpo_cred_label_update_execve_t *hook = mpc->mpc_ops->mpo_cred_label_update_execve;
835*d4514f0bSApple OSS Distributions 				if (hook == NULL) {
836*d4514f0bSApple OSS Distributions 					continue;
837*d4514f0bSApple OSS Distributions 				}
838*d4514f0bSApple OSS Distributions 
839*d4514f0bSApple OSS Distributions 				size_t spawnattrlen = 0;
840*d4514f0bSApple OSS Distributions 				void *spawnattr = exec_spawnattr_getmacpolicyinfo(macextensions, mpc->mpc_name, &spawnattrlen);
841*d4514f0bSApple OSS Distributions 
842*d4514f0bSApple OSS Distributions 				error = mac_error_select(hook(cred, new, vfs_context_proc(ctx), vp, offset, scriptvp,
843*d4514f0bSApple OSS Distributions 				    mac_vnode_label(vp), scriptvnodelabel, execl, csflags, spawnattr, spawnattrlen, disjoint),
844*d4514f0bSApple OSS Distributions 				    error);
845*d4514f0bSApple OSS Distributions 			}
846*d4514f0bSApple OSS Distributions 			mac_policy_list_unbusy();
847*d4514f0bSApple OSS Distributions 		}
848*d4514f0bSApple OSS Distributions 	}
849*d4514f0bSApple OSS Distributions 	*labelupdateerror = error;
850*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(27, vp);
851*d4514f0bSApple OSS Distributions }
852*d4514f0bSApple OSS Distributions 
853*d4514f0bSApple OSS Distributions int
mac_cred_check_label_update_execve(vfs_context_t ctx,struct vnode * vp,off_t offset,struct vnode * scriptvp,struct label * scriptvnodelabel,struct label * execlabel,struct proc * p,void * macextensions)854*d4514f0bSApple OSS Distributions mac_cred_check_label_update_execve(vfs_context_t ctx, struct vnode *vp, off_t offset,
855*d4514f0bSApple OSS Distributions     struct vnode *scriptvp, struct label *scriptvnodelabel, struct label *execlabel,
856*d4514f0bSApple OSS Distributions     struct proc *p, void *macextensions)
857*d4514f0bSApple OSS Distributions {
858*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
859*d4514f0bSApple OSS Distributions 	int result = 0;
860*d4514f0bSApple OSS Distributions 
861*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
862*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
863*d4514f0bSApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
864*d4514f0bSApple OSS Distributions 		return result;
865*d4514f0bSApple OSS Distributions 	}
866*d4514f0bSApple OSS Distributions #endif
867*d4514f0bSApple OSS Distributions 
868*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
869*d4514f0bSApple OSS Distributions 
870*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(28, vp);
871*d4514f0bSApple OSS Distributions 	/*
872*d4514f0bSApple OSS Distributions 	 * NB: Cannot use MAC_BOOLEAN macro because we need a sequence point after
873*d4514f0bSApple OSS Distributions 	 *     calling exec_spawnattr_getmacpolicyinfo() and before passing the
874*d4514f0bSApple OSS Distributions 	 *     spawnattrlen as an argument to the hook.
875*d4514f0bSApple OSS Distributions 	 */
876*d4514f0bSApple OSS Distributions 	{
877*d4514f0bSApple OSS Distributions 		struct mac_policy_conf *mpc;
878*d4514f0bSApple OSS Distributions 		u_int i;
879*d4514f0bSApple OSS Distributions 
880*d4514f0bSApple OSS Distributions 		for (i = 0; i < mac_policy_list.staticmax; i++) {
881*d4514f0bSApple OSS Distributions 			mpc = mac_policy_list.entries[i].mpc;
882*d4514f0bSApple OSS Distributions 			if (mpc == NULL) {
883*d4514f0bSApple OSS Distributions 				continue;
884*d4514f0bSApple OSS Distributions 			}
885*d4514f0bSApple OSS Distributions 
886*d4514f0bSApple OSS Distributions 			mpo_cred_check_label_update_execve_t *hook = mpc->mpc_ops->mpo_cred_check_label_update_execve;
887*d4514f0bSApple OSS Distributions 			if (hook == NULL) {
888*d4514f0bSApple OSS Distributions 				continue;
889*d4514f0bSApple OSS Distributions 			}
890*d4514f0bSApple OSS Distributions 
891*d4514f0bSApple OSS Distributions 			size_t spawnattrlen = 0;
892*d4514f0bSApple OSS Distributions 			void *spawnattr = exec_spawnattr_getmacpolicyinfo(macextensions, mpc->mpc_name, &spawnattrlen);
893*d4514f0bSApple OSS Distributions 
894*d4514f0bSApple OSS Distributions 			result = result || hook(cred, vp, offset, scriptvp, mac_vnode_label(vp), scriptvnodelabel, execlabel, p, spawnattr, spawnattrlen);
895*d4514f0bSApple OSS Distributions 		}
896*d4514f0bSApple OSS Distributions 		if (mac_policy_list_conditional_busy() != 0) {
897*d4514f0bSApple OSS Distributions 			for (; i <= mac_policy_list.maxindex; i++) {
898*d4514f0bSApple OSS Distributions 				mpc = mac_policy_list.entries[i].mpc;
899*d4514f0bSApple OSS Distributions 				if (mpc == NULL) {
900*d4514f0bSApple OSS Distributions 					continue;
901*d4514f0bSApple OSS Distributions 				}
902*d4514f0bSApple OSS Distributions 
903*d4514f0bSApple OSS Distributions 				mpo_cred_check_label_update_execve_t *hook = mpc->mpc_ops->mpo_cred_check_label_update_execve;
904*d4514f0bSApple OSS Distributions 				if (hook == NULL) {
905*d4514f0bSApple OSS Distributions 					continue;
906*d4514f0bSApple OSS Distributions 				}
907*d4514f0bSApple OSS Distributions 
908*d4514f0bSApple OSS Distributions 				size_t spawnattrlen = 0;
909*d4514f0bSApple OSS Distributions 				void *spawnattr = exec_spawnattr_getmacpolicyinfo(macextensions, mpc->mpc_name, &spawnattrlen);
910*d4514f0bSApple OSS Distributions 
911*d4514f0bSApple OSS Distributions 				result = result || hook(cred, vp, offset, scriptvp, mac_vnode_label(vp), scriptvnodelabel, execlabel, p, spawnattr, spawnattrlen);
912*d4514f0bSApple OSS Distributions 			}
913*d4514f0bSApple OSS Distributions 			mac_policy_list_unbusy();
914*d4514f0bSApple OSS Distributions 		}
915*d4514f0bSApple OSS Distributions 	}
916*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(28, vp);
917*d4514f0bSApple OSS Distributions 
918*d4514f0bSApple OSS Distributions 	return result;
919*d4514f0bSApple OSS Distributions }
920*d4514f0bSApple OSS Distributions 
921*d4514f0bSApple OSS Distributions int
mac_vnode_check_access(vfs_context_t ctx,struct vnode * vp,int acc_mode)922*d4514f0bSApple OSS Distributions mac_vnode_check_access(vfs_context_t ctx, struct vnode *vp,
923*d4514f0bSApple OSS Distributions     int acc_mode)
924*d4514f0bSApple OSS Distributions {
925*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
926*d4514f0bSApple OSS Distributions 	int error;
927*d4514f0bSApple OSS Distributions 	int mask;
928*d4514f0bSApple OSS Distributions 
929*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
930*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
931*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
932*d4514f0bSApple OSS Distributions 		return 0;
933*d4514f0bSApple OSS Distributions 	}
934*d4514f0bSApple OSS Distributions #endif
935*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
936*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
937*d4514f0bSApple OSS Distributions 		return 0;
938*d4514f0bSApple OSS Distributions 	}
939*d4514f0bSApple OSS Distributions 	/* Convert {R,W,X}_OK values to V{READ,WRITE,EXEC} for entry points */
940*d4514f0bSApple OSS Distributions 	mask = ACCESS_MODE_TO_VNODE_MASK(acc_mode);
941*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(29, vp);
942*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_access, cred, vp, mac_vnode_label(vp), mask);
943*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(29, vp);
944*d4514f0bSApple OSS Distributions 	return error;
945*d4514f0bSApple OSS Distributions }
946*d4514f0bSApple OSS Distributions 
947*d4514f0bSApple OSS Distributions int
mac_vnode_check_chdir(vfs_context_t ctx,struct vnode * dvp)948*d4514f0bSApple OSS Distributions mac_vnode_check_chdir(vfs_context_t ctx, struct vnode *dvp)
949*d4514f0bSApple OSS Distributions {
950*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
951*d4514f0bSApple OSS Distributions 	int error;
952*d4514f0bSApple OSS Distributions 
953*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
954*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
955*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
956*d4514f0bSApple OSS Distributions 		return 0;
957*d4514f0bSApple OSS Distributions 	}
958*d4514f0bSApple OSS Distributions #endif
959*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
960*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
961*d4514f0bSApple OSS Distributions 		return 0;
962*d4514f0bSApple OSS Distributions 	}
963*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(30, dvp);
964*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_chdir, cred, dvp, mac_vnode_label(dvp));
965*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(30, dvp);
966*d4514f0bSApple OSS Distributions 	return error;
967*d4514f0bSApple OSS Distributions }
968*d4514f0bSApple OSS Distributions 
969*d4514f0bSApple OSS Distributions int
mac_vnode_check_chroot(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp)970*d4514f0bSApple OSS Distributions mac_vnode_check_chroot(vfs_context_t ctx, struct vnode *dvp,
971*d4514f0bSApple OSS Distributions     struct componentname *cnp)
972*d4514f0bSApple OSS Distributions {
973*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
974*d4514f0bSApple OSS Distributions 	int error;
975*d4514f0bSApple OSS Distributions 
976*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
977*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
978*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
979*d4514f0bSApple OSS Distributions 		return 0;
980*d4514f0bSApple OSS Distributions 	}
981*d4514f0bSApple OSS Distributions #endif
982*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
983*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
984*d4514f0bSApple OSS Distributions 		return 0;
985*d4514f0bSApple OSS Distributions 	}
986*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(31, dvp);
987*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_chroot, cred, dvp, mac_vnode_label(dvp), cnp);
988*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(31, dvp);
989*d4514f0bSApple OSS Distributions 	return error;
990*d4514f0bSApple OSS Distributions }
991*d4514f0bSApple OSS Distributions 
992*d4514f0bSApple OSS Distributions int
mac_vnode_check_clone(vfs_context_t ctx,struct vnode * dvp,struct vnode * vp,struct componentname * cnp)993*d4514f0bSApple OSS Distributions mac_vnode_check_clone(vfs_context_t ctx, struct vnode *dvp,
994*d4514f0bSApple OSS Distributions     struct vnode *vp, struct componentname *cnp)
995*d4514f0bSApple OSS Distributions {
996*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
997*d4514f0bSApple OSS Distributions 	int error;
998*d4514f0bSApple OSS Distributions 
999*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1000*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1001*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1002*d4514f0bSApple OSS Distributions 		return 0;
1003*d4514f0bSApple OSS Distributions 	}
1004*d4514f0bSApple OSS Distributions #endif
1005*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1006*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1007*d4514f0bSApple OSS Distributions 		return 0;
1008*d4514f0bSApple OSS Distributions 	}
1009*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(32, dvp);
1010*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_clone, cred, dvp, mac_vnode_label(dvp), vp,
1011*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp), cnp);
1012*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(32, dvp);
1013*d4514f0bSApple OSS Distributions 	return error;
1014*d4514f0bSApple OSS Distributions }
1015*d4514f0bSApple OSS Distributions int
mac_vnode_check_create(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp,struct vnode_attr * vap)1016*d4514f0bSApple OSS Distributions mac_vnode_check_create(vfs_context_t ctx, struct vnode *dvp,
1017*d4514f0bSApple OSS Distributions     struct componentname *cnp, struct vnode_attr *vap)
1018*d4514f0bSApple OSS Distributions {
1019*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1020*d4514f0bSApple OSS Distributions 	int error;
1021*d4514f0bSApple OSS Distributions 
1022*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1023*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1024*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1025*d4514f0bSApple OSS Distributions 		return 0;
1026*d4514f0bSApple OSS Distributions 	}
1027*d4514f0bSApple OSS Distributions #endif
1028*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1029*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1030*d4514f0bSApple OSS Distributions 		return 0;
1031*d4514f0bSApple OSS Distributions 	}
1032*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(33, dvp);
1033*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_create, cred, dvp, mac_vnode_label(dvp), cnp, vap);
1034*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(33, dvp);
1035*d4514f0bSApple OSS Distributions 	return error;
1036*d4514f0bSApple OSS Distributions }
1037*d4514f0bSApple OSS Distributions 
1038*d4514f0bSApple OSS Distributions int
mac_vnode_check_unlink(vfs_context_t ctx,struct vnode * dvp,struct vnode * vp,struct componentname * cnp)1039*d4514f0bSApple OSS Distributions mac_vnode_check_unlink(vfs_context_t ctx, struct vnode *dvp, struct vnode *vp,
1040*d4514f0bSApple OSS Distributions     struct componentname *cnp)
1041*d4514f0bSApple OSS Distributions {
1042*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1043*d4514f0bSApple OSS Distributions 	int error;
1044*d4514f0bSApple OSS Distributions 
1045*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1046*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1047*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1048*d4514f0bSApple OSS Distributions 		return 0;
1049*d4514f0bSApple OSS Distributions 	}
1050*d4514f0bSApple OSS Distributions #endif
1051*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1052*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1053*d4514f0bSApple OSS Distributions 		return 0;
1054*d4514f0bSApple OSS Distributions 	}
1055*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(34, dvp);
1056*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_unlink, cred, dvp, mac_vnode_label(dvp), vp,
1057*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp), cnp);
1058*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(34, dvp);
1059*d4514f0bSApple OSS Distributions 	return error;
1060*d4514f0bSApple OSS Distributions }
1061*d4514f0bSApple OSS Distributions #if 0
1062*d4514f0bSApple OSS Distributions int
1063*d4514f0bSApple OSS Distributions mac_vnode_check_deleteacl(vfs_context_t ctx, struct vnode *vp,
1064*d4514f0bSApple OSS Distributions     acl_type_t type)
1065*d4514f0bSApple OSS Distributions {
1066*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1067*d4514f0bSApple OSS Distributions 	int error;
1068*d4514f0bSApple OSS Distributions 
1069*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1070*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1071*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1072*d4514f0bSApple OSS Distributions 		return 0;
1073*d4514f0bSApple OSS Distributions 	}
1074*d4514f0bSApple OSS Distributions #endif
1075*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1076*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1077*d4514f0bSApple OSS Distributions 		return 0;
1078*d4514f0bSApple OSS Distributions 	}
1079*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(35, dvp);
1080*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_deleteacl, cred, vp, mac_vnode_label(vp), type);
1081*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(35, dvp);
1082*d4514f0bSApple OSS Distributions 	return error;
1083*d4514f0bSApple OSS Distributions }
1084*d4514f0bSApple OSS Distributions #endif
1085*d4514f0bSApple OSS Distributions 
1086*d4514f0bSApple OSS Distributions int
mac_vnode_check_deleteextattr(vfs_context_t ctx,struct vnode * vp,const char * name)1087*d4514f0bSApple OSS Distributions mac_vnode_check_deleteextattr(vfs_context_t ctx, struct vnode *vp,
1088*d4514f0bSApple OSS Distributions     const char *name)
1089*d4514f0bSApple OSS Distributions {
1090*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1091*d4514f0bSApple OSS Distributions 	int error;
1092*d4514f0bSApple OSS Distributions 
1093*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1094*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1095*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1096*d4514f0bSApple OSS Distributions 		return 0;
1097*d4514f0bSApple OSS Distributions 	}
1098*d4514f0bSApple OSS Distributions #endif
1099*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1100*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1101*d4514f0bSApple OSS Distributions 		return 0;
1102*d4514f0bSApple OSS Distributions 	}
1103*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(36, vp);
1104*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_deleteextattr, cred, vp, mac_vnode_label(vp), name);
1105*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(36, vp);
1106*d4514f0bSApple OSS Distributions 	return error;
1107*d4514f0bSApple OSS Distributions }
1108*d4514f0bSApple OSS Distributions int
mac_vnode_check_exchangedata(vfs_context_t ctx,struct vnode * v1,struct vnode * v2)1109*d4514f0bSApple OSS Distributions mac_vnode_check_exchangedata(vfs_context_t ctx,
1110*d4514f0bSApple OSS Distributions     struct vnode *v1, struct vnode *v2)
1111*d4514f0bSApple OSS Distributions {
1112*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1113*d4514f0bSApple OSS Distributions 	int error;
1114*d4514f0bSApple OSS Distributions 
1115*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1116*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1117*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1118*d4514f0bSApple OSS Distributions 		return 0;
1119*d4514f0bSApple OSS Distributions 	}
1120*d4514f0bSApple OSS Distributions #endif
1121*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1122*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1123*d4514f0bSApple OSS Distributions 		return 0;
1124*d4514f0bSApple OSS Distributions 	}
1125*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(37, v1);
1126*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_exchangedata, cred, v1, mac_vnode_label(v1),
1127*d4514f0bSApple OSS Distributions 	    v2, mac_vnode_label(v2));
1128*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(37, v1);
1129*d4514f0bSApple OSS Distributions 
1130*d4514f0bSApple OSS Distributions 	return error;
1131*d4514f0bSApple OSS Distributions }
1132*d4514f0bSApple OSS Distributions 
1133*d4514f0bSApple OSS Distributions #if 0
1134*d4514f0bSApple OSS Distributions int
1135*d4514f0bSApple OSS Distributions mac_vnode_check_getacl(vfs_context_t ctx, struct vnode *vp, acl_type_t type)
1136*d4514f0bSApple OSS Distributions {
1137*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1138*d4514f0bSApple OSS Distributions 	int error;
1139*d4514f0bSApple OSS Distributions 
1140*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1141*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1142*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1143*d4514f0bSApple OSS Distributions 		return 0;
1144*d4514f0bSApple OSS Distributions 	}
1145*d4514f0bSApple OSS Distributions #endif
1146*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1147*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1148*d4514f0bSApple OSS Distributions 		return 0;
1149*d4514f0bSApple OSS Distributions 	}
1150*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(38, vp);
1151*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_getacl, cred, vp, mac_vnode_label(vp), type);
1152*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(38, vp);
1153*d4514f0bSApple OSS Distributions 	return error;
1154*d4514f0bSApple OSS Distributions }
1155*d4514f0bSApple OSS Distributions #endif
1156*d4514f0bSApple OSS Distributions 
1157*d4514f0bSApple OSS Distributions int
mac_vnode_check_getattr(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp,struct vnode_attr * va)1158*d4514f0bSApple OSS Distributions mac_vnode_check_getattr(vfs_context_t ctx, struct ucred *file_cred,
1159*d4514f0bSApple OSS Distributions     struct vnode *vp, struct vnode_attr *va)
1160*d4514f0bSApple OSS Distributions {
1161*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1162*d4514f0bSApple OSS Distributions 	int error;
1163*d4514f0bSApple OSS Distributions 
1164*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1165*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1166*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1167*d4514f0bSApple OSS Distributions 		return 0;
1168*d4514f0bSApple OSS Distributions 	}
1169*d4514f0bSApple OSS Distributions #endif
1170*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1171*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1172*d4514f0bSApple OSS Distributions 		return 0;
1173*d4514f0bSApple OSS Distributions 	}
1174*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(39, vp);
1175*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_getattr, cred, file_cred, vp, mac_vnode_label(vp), va);
1176*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(39, vp);
1177*d4514f0bSApple OSS Distributions 	return error;
1178*d4514f0bSApple OSS Distributions }
1179*d4514f0bSApple OSS Distributions 
1180*d4514f0bSApple OSS Distributions int
mac_vnode_check_getattrlist(vfs_context_t ctx,struct vnode * vp,struct attrlist * alist,uint64_t options)1181*d4514f0bSApple OSS Distributions mac_vnode_check_getattrlist(vfs_context_t ctx, struct vnode *vp,
1182*d4514f0bSApple OSS Distributions     struct attrlist *alist, uint64_t options)
1183*d4514f0bSApple OSS Distributions {
1184*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1185*d4514f0bSApple OSS Distributions 	int error;
1186*d4514f0bSApple OSS Distributions 
1187*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1188*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1189*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1190*d4514f0bSApple OSS Distributions 		return 0;
1191*d4514f0bSApple OSS Distributions 	}
1192*d4514f0bSApple OSS Distributions #endif
1193*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1194*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1195*d4514f0bSApple OSS Distributions 		return 0;
1196*d4514f0bSApple OSS Distributions 	}
1197*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(40, vp);
1198*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_getattrlist, cred, vp, mac_vnode_label(vp), alist, options);
1199*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(40, vp);
1200*d4514f0bSApple OSS Distributions 
1201*d4514f0bSApple OSS Distributions 	/* Falsify results instead of returning error? */
1202*d4514f0bSApple OSS Distributions 	return error;
1203*d4514f0bSApple OSS Distributions }
1204*d4514f0bSApple OSS Distributions 
1205*d4514f0bSApple OSS Distributions int
mac_vnode_check_exec(vfs_context_t ctx,struct vnode * vp,struct image_params * imgp)1206*d4514f0bSApple OSS Distributions mac_vnode_check_exec(vfs_context_t ctx, struct vnode *vp,
1207*d4514f0bSApple OSS Distributions     struct image_params *imgp)
1208*d4514f0bSApple OSS Distributions {
1209*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1210*d4514f0bSApple OSS Distributions 	int error = 0;
1211*d4514f0bSApple OSS Distributions 
1212*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1213*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1214*d4514f0bSApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
1215*d4514f0bSApple OSS Distributions 		return 0;
1216*d4514f0bSApple OSS Distributions 	}
1217*d4514f0bSApple OSS Distributions #endif
1218*d4514f0bSApple OSS Distributions 
1219*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1220*d4514f0bSApple OSS Distributions 
1221*d4514f0bSApple OSS Distributions 	/*
1222*d4514f0bSApple OSS Distributions 	 * NB: Cannot use MAC_CHECK macro because we need a sequence point after
1223*d4514f0bSApple OSS Distributions 	 *     calling exec_spawnattr_getmacpolicyinfo() and before passing the
1224*d4514f0bSApple OSS Distributions 	 *     spawnattrlen as an argument to the hook.
1225*d4514f0bSApple OSS Distributions 	 */
1226*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(41, vp);
1227*d4514f0bSApple OSS Distributions 	{
1228*d4514f0bSApple OSS Distributions 		struct mac_policy_conf *mpc;
1229*d4514f0bSApple OSS Distributions 		u_int i;
1230*d4514f0bSApple OSS Distributions 
1231*d4514f0bSApple OSS Distributions 		for (i = 0; i < mac_policy_list.staticmax; i++) {
1232*d4514f0bSApple OSS Distributions 			mpc = mac_policy_list.entries[i].mpc;
1233*d4514f0bSApple OSS Distributions 			if (mpc == NULL) {
1234*d4514f0bSApple OSS Distributions 				continue;
1235*d4514f0bSApple OSS Distributions 			}
1236*d4514f0bSApple OSS Distributions 
1237*d4514f0bSApple OSS Distributions 			mpo_vnode_check_exec_t *hook = mpc->mpc_ops->mpo_vnode_check_exec;
1238*d4514f0bSApple OSS Distributions 			if (hook == NULL) {
1239*d4514f0bSApple OSS Distributions 				continue;
1240*d4514f0bSApple OSS Distributions 			}
1241*d4514f0bSApple OSS Distributions 
1242*d4514f0bSApple OSS Distributions 			size_t spawnattrlen = 0;
1243*d4514f0bSApple OSS Distributions 			void *spawnattr = exec_spawnattr_getmacpolicyinfo(&imgp->ip_px_smpx, mpc->mpc_name, &spawnattrlen);
1244*d4514f0bSApple OSS Distributions 
1245*d4514f0bSApple OSS Distributions 			error = mac_error_select(
1246*d4514f0bSApple OSS Distributions 				hook(cred,
1247*d4514f0bSApple OSS Distributions 				vp, imgp->ip_scriptvp, mac_vnode_label(vp), imgp->ip_scriptlabelp,
1248*d4514f0bSApple OSS Distributions 				imgp->ip_execlabelp, &imgp->ip_ndp->ni_cnd, &imgp->ip_csflags,
1249*d4514f0bSApple OSS Distributions 				spawnattr, spawnattrlen), error);
1250*d4514f0bSApple OSS Distributions 		}
1251*d4514f0bSApple OSS Distributions 		if (mac_policy_list_conditional_busy() != 0) {
1252*d4514f0bSApple OSS Distributions 			for (; i <= mac_policy_list.maxindex; i++) {
1253*d4514f0bSApple OSS Distributions 				mpc = mac_policy_list.entries[i].mpc;
1254*d4514f0bSApple OSS Distributions 				if (mpc == NULL) {
1255*d4514f0bSApple OSS Distributions 					continue;
1256*d4514f0bSApple OSS Distributions 				}
1257*d4514f0bSApple OSS Distributions 
1258*d4514f0bSApple OSS Distributions 				mpo_vnode_check_exec_t *hook = mpc->mpc_ops->mpo_vnode_check_exec;
1259*d4514f0bSApple OSS Distributions 				if (hook == NULL) {
1260*d4514f0bSApple OSS Distributions 					continue;
1261*d4514f0bSApple OSS Distributions 				}
1262*d4514f0bSApple OSS Distributions 
1263*d4514f0bSApple OSS Distributions 				size_t spawnattrlen = 0;
1264*d4514f0bSApple OSS Distributions 				void *spawnattr = exec_spawnattr_getmacpolicyinfo(&imgp->ip_px_smpx, mpc->mpc_name, &spawnattrlen);
1265*d4514f0bSApple OSS Distributions 
1266*d4514f0bSApple OSS Distributions 				error = mac_error_select(
1267*d4514f0bSApple OSS Distributions 					hook(cred,
1268*d4514f0bSApple OSS Distributions 					vp, imgp->ip_scriptvp, mac_vnode_label(vp), imgp->ip_scriptlabelp,
1269*d4514f0bSApple OSS Distributions 					imgp->ip_execlabelp, &imgp->ip_ndp->ni_cnd, &imgp->ip_csflags,
1270*d4514f0bSApple OSS Distributions 					spawnattr, spawnattrlen), error);
1271*d4514f0bSApple OSS Distributions 			}
1272*d4514f0bSApple OSS Distributions 			mac_policy_list_unbusy();
1273*d4514f0bSApple OSS Distributions 		}
1274*d4514f0bSApple OSS Distributions 	}
1275*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(41, vp);
1276*d4514f0bSApple OSS Distributions 
1277*d4514f0bSApple OSS Distributions 	return error;
1278*d4514f0bSApple OSS Distributions }
1279*d4514f0bSApple OSS Distributions 
1280*d4514f0bSApple OSS Distributions int
mac_vnode_check_fsgetpath(vfs_context_t ctx,struct vnode * vp)1281*d4514f0bSApple OSS Distributions mac_vnode_check_fsgetpath(vfs_context_t ctx, struct vnode *vp)
1282*d4514f0bSApple OSS Distributions {
1283*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1284*d4514f0bSApple OSS Distributions 	int error;
1285*d4514f0bSApple OSS Distributions 
1286*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1287*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1288*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1289*d4514f0bSApple OSS Distributions 		return 0;
1290*d4514f0bSApple OSS Distributions 	}
1291*d4514f0bSApple OSS Distributions #endif
1292*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1293*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1294*d4514f0bSApple OSS Distributions 		return 0;
1295*d4514f0bSApple OSS Distributions 	}
1296*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(42, vp);
1297*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_fsgetpath, cred, vp, mac_vnode_label(vp));
1298*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(42, vp);
1299*d4514f0bSApple OSS Distributions 	return error;
1300*d4514f0bSApple OSS Distributions }
1301*d4514f0bSApple OSS Distributions 
1302*d4514f0bSApple OSS Distributions int
mac_vnode_check_signature(struct vnode * vp,struct cs_blob * cs_blob,struct image_params * imgp,unsigned int * cs_flags,unsigned int * signer_type,int flags,unsigned int platform)1303*d4514f0bSApple OSS Distributions mac_vnode_check_signature(struct vnode *vp, struct cs_blob *cs_blob,
1304*d4514f0bSApple OSS Distributions     struct image_params *imgp,
1305*d4514f0bSApple OSS Distributions     unsigned int *cs_flags, unsigned int *signer_type,
1306*d4514f0bSApple OSS Distributions     int flags, unsigned int platform)
1307*d4514f0bSApple OSS Distributions {
1308*d4514f0bSApple OSS Distributions 	int error;
1309*d4514f0bSApple OSS Distributions 	char *fatal_failure_desc = NULL;
1310*d4514f0bSApple OSS Distributions 	size_t fatal_failure_desc_len = 0;
1311*d4514f0bSApple OSS Distributions 
1312*d4514f0bSApple OSS Distributions 	char *vn_path = NULL;
1313*d4514f0bSApple OSS Distributions 	vm_size_t vn_pathlen = MAXPATHLEN;
1314*d4514f0bSApple OSS Distributions 	cpu_type_t cpu_type = (imgp == NULL) ? CPU_TYPE_ANY : imgp->ip_origcputype;
1315*d4514f0bSApple OSS Distributions 
1316*d4514f0bSApple OSS Distributions 
1317*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1318*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1319*d4514f0bSApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
1320*d4514f0bSApple OSS Distributions 		return 0;
1321*d4514f0bSApple OSS Distributions 	}
1322*d4514f0bSApple OSS Distributions #endif
1323*d4514f0bSApple OSS Distributions 
1324*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(43, vp);
1325*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_signature, vp, mac_vnode_label(vp), cpu_type, cs_blob,
1326*d4514f0bSApple OSS Distributions 	    cs_flags, signer_type, flags, platform, &fatal_failure_desc, &fatal_failure_desc_len);
1327*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(43, vp);
1328*d4514f0bSApple OSS Distributions 
1329*d4514f0bSApple OSS Distributions 	if (fatal_failure_desc_len) {
1330*d4514f0bSApple OSS Distributions 		// A fatal code signature validation failure occured, formulate a crash
1331*d4514f0bSApple OSS Distributions 		// reason.
1332*d4514f0bSApple OSS Distributions 
1333*d4514f0bSApple OSS Distributions 		char const *path = NULL;
1334*d4514f0bSApple OSS Distributions 
1335*d4514f0bSApple OSS Distributions 		vn_path = zalloc(ZV_NAMEI);
1336*d4514f0bSApple OSS Distributions 		if (vn_getpath(vp, vn_path, (int*)&vn_pathlen) == 0) {
1337*d4514f0bSApple OSS Distributions 			path = vn_path;
1338*d4514f0bSApple OSS Distributions 		} else {
1339*d4514f0bSApple OSS Distributions 			path = "(get vnode path failed)";
1340*d4514f0bSApple OSS Distributions 		}
1341*d4514f0bSApple OSS Distributions 
1342*d4514f0bSApple OSS Distributions 		if (error == 0) {
1343*d4514f0bSApple OSS Distributions 			panic("mac_vnode_check_signature: MAC hook returned no error, "
1344*d4514f0bSApple OSS Distributions 			    "but status is claimed to be fatal? "
1345*d4514f0bSApple OSS Distributions 			    "path: '%s', fatal_failure_desc_len: %ld, fatal_failure_desc:\n%s\n",
1346*d4514f0bSApple OSS Distributions 			    path, fatal_failure_desc_len, fatal_failure_desc);
1347*d4514f0bSApple OSS Distributions 		}
1348*d4514f0bSApple OSS Distributions 
1349*d4514f0bSApple OSS Distributions 		printf("mac_vnode_check_signature: %s: code signature validation failed fatally: %s",
1350*d4514f0bSApple OSS Distributions 		    path, fatal_failure_desc);
1351*d4514f0bSApple OSS Distributions 
1352*d4514f0bSApple OSS Distributions 		if (imgp == NULL) {
1353*d4514f0bSApple OSS Distributions 			goto out;
1354*d4514f0bSApple OSS Distributions 		}
1355*d4514f0bSApple OSS Distributions 
1356*d4514f0bSApple OSS Distributions 		os_reason_t reason = os_reason_create(OS_REASON_CODESIGNING,
1357*d4514f0bSApple OSS Distributions 		    CODESIGNING_EXIT_REASON_TASKGATED_INVALID_SIG);
1358*d4514f0bSApple OSS Distributions 
1359*d4514f0bSApple OSS Distributions 		if (reason == OS_REASON_NULL) {
1360*d4514f0bSApple OSS Distributions 			printf("mac_vnode_check_signature: %s: failure to allocate exit reason for validation failure: %s\n",
1361*d4514f0bSApple OSS Distributions 			    path, fatal_failure_desc);
1362*d4514f0bSApple OSS Distributions 			goto out;
1363*d4514f0bSApple OSS Distributions 		}
1364*d4514f0bSApple OSS Distributions 
1365*d4514f0bSApple OSS Distributions 		imgp->ip_cs_error = reason;
1366*d4514f0bSApple OSS Distributions 		reason->osr_flags = (OS_REASON_FLAG_GENERATE_CRASH_REPORT |
1367*d4514f0bSApple OSS Distributions 		    OS_REASON_FLAG_CONSISTENT_FAILURE);
1368*d4514f0bSApple OSS Distributions 
1369*d4514f0bSApple OSS Distributions 		if (fatal_failure_desc == NULL) {
1370*d4514f0bSApple OSS Distributions 			// This may happen if allocation for the buffer failed.
1371*d4514f0bSApple OSS Distributions 			printf("mac_vnode_check_signature: %s: fatal failure is missing its description.\n", path);
1372*d4514f0bSApple OSS Distributions 		} else {
1373*d4514f0bSApple OSS Distributions 			mach_vm_address_t data_addr = 0;
1374*d4514f0bSApple OSS Distributions 
1375*d4514f0bSApple OSS Distributions 			int reason_error = 0;
1376*d4514f0bSApple OSS Distributions 			int kcdata_error = 0;
1377*d4514f0bSApple OSS Distributions 
1378*d4514f0bSApple OSS Distributions 			if ((reason_error = os_reason_alloc_buffer_noblock(reason, kcdata_estimate_required_buffer_size
1379*d4514f0bSApple OSS Distributions 			    (1, (uint32_t)fatal_failure_desc_len))) == 0 &&
1380*d4514f0bSApple OSS Distributions 			    (kcdata_error = kcdata_get_memory_addr(&reason->osr_kcd_descriptor,
1381*d4514f0bSApple OSS Distributions 			    EXIT_REASON_USER_DESC, (uint32_t)fatal_failure_desc_len,
1382*d4514f0bSApple OSS Distributions 			    &data_addr)) == KERN_SUCCESS) {
1383*d4514f0bSApple OSS Distributions 				kern_return_t mc_error = kcdata_memcpy(&reason->osr_kcd_descriptor, (mach_vm_address_t)data_addr,
1384*d4514f0bSApple OSS Distributions 				    fatal_failure_desc, (uint32_t)fatal_failure_desc_len);
1385*d4514f0bSApple OSS Distributions 
1386*d4514f0bSApple OSS Distributions 				if (mc_error != KERN_SUCCESS) {
1387*d4514f0bSApple OSS Distributions 					printf("mac_vnode_check_signature: %s: failed to copy reason string "
1388*d4514f0bSApple OSS Distributions 					    "(kcdata_memcpy error: %d, length: %ld)\n",
1389*d4514f0bSApple OSS Distributions 					    path, mc_error, fatal_failure_desc_len);
1390*d4514f0bSApple OSS Distributions 				}
1391*d4514f0bSApple OSS Distributions 			} else {
1392*d4514f0bSApple OSS Distributions 				printf("mac_vnode_check_signature: %s: failed to allocate space for reason string "
1393*d4514f0bSApple OSS Distributions 				    "(os_reason_alloc_buffer error: %d, kcdata error: %d, length: %ld)\n",
1394*d4514f0bSApple OSS Distributions 				    path, reason_error, kcdata_error, fatal_failure_desc_len);
1395*d4514f0bSApple OSS Distributions 			}
1396*d4514f0bSApple OSS Distributions 		}
1397*d4514f0bSApple OSS Distributions 	}
1398*d4514f0bSApple OSS Distributions 
1399*d4514f0bSApple OSS Distributions out:
1400*d4514f0bSApple OSS Distributions 	if (vn_path) {
1401*d4514f0bSApple OSS Distributions 		zfree(ZV_NAMEI, vn_path);
1402*d4514f0bSApple OSS Distributions 	}
1403*d4514f0bSApple OSS Distributions 
1404*d4514f0bSApple OSS Distributions 	if (fatal_failure_desc_len > 0 && fatal_failure_desc != NULL) {
1405*d4514f0bSApple OSS Distributions 		/* KERN_AMFI_SUPPORTS_DATA_ALLOC >= 2 */
1406*d4514f0bSApple OSS Distributions 		kfree_data(fatal_failure_desc, fatal_failure_desc_len);
1407*d4514f0bSApple OSS Distributions 	}
1408*d4514f0bSApple OSS Distributions 
1409*d4514f0bSApple OSS Distributions 	return error;
1410*d4514f0bSApple OSS Distributions }
1411*d4514f0bSApple OSS Distributions 
1412*d4514f0bSApple OSS Distributions int
mac_vnode_check_supplemental_signature(struct vnode * vp,struct cs_blob * cs_blob,struct vnode * linked_vp,struct cs_blob * linked_cs_blob,unsigned int * signer_type)1413*d4514f0bSApple OSS Distributions mac_vnode_check_supplemental_signature(struct vnode *vp,
1414*d4514f0bSApple OSS Distributions     struct cs_blob *cs_blob, struct vnode *linked_vp,
1415*d4514f0bSApple OSS Distributions     struct cs_blob *linked_cs_blob, unsigned int *signer_type)
1416*d4514f0bSApple OSS Distributions {
1417*d4514f0bSApple OSS Distributions 	int error;
1418*d4514f0bSApple OSS Distributions 
1419*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1420*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1421*d4514f0bSApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
1422*d4514f0bSApple OSS Distributions 		return 0;
1423*d4514f0bSApple OSS Distributions 	}
1424*d4514f0bSApple OSS Distributions #endif
1425*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(93, vp);
1426*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_supplemental_signature, vp, mac_vnode_label(vp), cs_blob, linked_vp, linked_cs_blob,
1427*d4514f0bSApple OSS Distributions 	    signer_type);
1428*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(93, vp);
1429*d4514f0bSApple OSS Distributions 
1430*d4514f0bSApple OSS Distributions 	return error;
1431*d4514f0bSApple OSS Distributions }
1432*d4514f0bSApple OSS Distributions 
1433*d4514f0bSApple OSS Distributions #if 0
1434*d4514f0bSApple OSS Distributions int
1435*d4514f0bSApple OSS Distributions mac_vnode_check_getacl(vfs_context_t ctx, struct vnode *vp, acl_type_t type)
1436*d4514f0bSApple OSS Distributions {
1437*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1438*d4514f0bSApple OSS Distributions 	int error;
1439*d4514f0bSApple OSS Distributions 
1440*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1441*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1442*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1443*d4514f0bSApple OSS Distributions 		return 0;
1444*d4514f0bSApple OSS Distributions 	}
1445*d4514f0bSApple OSS Distributions #endif
1446*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1447*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1448*d4514f0bSApple OSS Distributions 		return 0;
1449*d4514f0bSApple OSS Distributions 	}
1450*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(44, vp);
1451*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_getacl, cred, vp, mac_vnode_label(vp), type);
1452*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(44, vp);
1453*d4514f0bSApple OSS Distributions 	return error;
1454*d4514f0bSApple OSS Distributions }
1455*d4514f0bSApple OSS Distributions #endif
1456*d4514f0bSApple OSS Distributions 
1457*d4514f0bSApple OSS Distributions int
mac_vnode_check_getextattr(vfs_context_t ctx,struct vnode * vp,const char * name,struct uio * uio)1458*d4514f0bSApple OSS Distributions mac_vnode_check_getextattr(vfs_context_t ctx, struct vnode *vp,
1459*d4514f0bSApple OSS Distributions     const char *name, struct uio *uio)
1460*d4514f0bSApple OSS Distributions {
1461*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1462*d4514f0bSApple OSS Distributions 	int error;
1463*d4514f0bSApple OSS Distributions 
1464*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1465*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1466*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1467*d4514f0bSApple OSS Distributions 		return 0;
1468*d4514f0bSApple OSS Distributions 	}
1469*d4514f0bSApple OSS Distributions #endif
1470*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1471*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1472*d4514f0bSApple OSS Distributions 		return 0;
1473*d4514f0bSApple OSS Distributions 	}
1474*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(45, vp);
1475*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_getextattr, cred, vp, mac_vnode_label(vp),
1476*d4514f0bSApple OSS Distributions 	    name, uio);
1477*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(45, vp);
1478*d4514f0bSApple OSS Distributions 	return error;
1479*d4514f0bSApple OSS Distributions }
1480*d4514f0bSApple OSS Distributions 
1481*d4514f0bSApple OSS Distributions int
mac_vnode_check_ioctl(vfs_context_t ctx,struct vnode * vp,u_long cmd)1482*d4514f0bSApple OSS Distributions mac_vnode_check_ioctl(vfs_context_t ctx, struct vnode *vp, u_long cmd)
1483*d4514f0bSApple OSS Distributions {
1484*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1485*d4514f0bSApple OSS Distributions 	int error;
1486*d4514f0bSApple OSS Distributions 
1487*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1488*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1489*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1490*d4514f0bSApple OSS Distributions 		return 0;
1491*d4514f0bSApple OSS Distributions 	}
1492*d4514f0bSApple OSS Distributions #endif
1493*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1494*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1495*d4514f0bSApple OSS Distributions 		return 0;
1496*d4514f0bSApple OSS Distributions 	}
1497*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(46, vp);
1498*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_ioctl, cred, vp, mac_vnode_label(vp), cmd);
1499*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(46, vp);
1500*d4514f0bSApple OSS Distributions 	return error;
1501*d4514f0bSApple OSS Distributions }
1502*d4514f0bSApple OSS Distributions 
1503*d4514f0bSApple OSS Distributions int
mac_vnode_check_kqfilter(vfs_context_t ctx,kauth_cred_t file_cred,struct knote * kn,struct vnode * vp)1504*d4514f0bSApple OSS Distributions mac_vnode_check_kqfilter(vfs_context_t ctx, kauth_cred_t file_cred,
1505*d4514f0bSApple OSS Distributions     struct knote *kn, struct vnode *vp)
1506*d4514f0bSApple OSS Distributions {
1507*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1508*d4514f0bSApple OSS Distributions 	int error;
1509*d4514f0bSApple OSS Distributions 
1510*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1511*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1512*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1513*d4514f0bSApple OSS Distributions 		return 0;
1514*d4514f0bSApple OSS Distributions 	}
1515*d4514f0bSApple OSS Distributions #endif
1516*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1517*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1518*d4514f0bSApple OSS Distributions 		return 0;
1519*d4514f0bSApple OSS Distributions 	}
1520*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(47, vp);
1521*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_kqfilter, cred, file_cred, kn, vp,
1522*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp));
1523*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(47, vp);
1524*d4514f0bSApple OSS Distributions 
1525*d4514f0bSApple OSS Distributions 	return error;
1526*d4514f0bSApple OSS Distributions }
1527*d4514f0bSApple OSS Distributions 
1528*d4514f0bSApple OSS Distributions int
mac_vnode_check_link(vfs_context_t ctx,struct vnode * dvp,struct vnode * vp,struct componentname * cnp)1529*d4514f0bSApple OSS Distributions mac_vnode_check_link(vfs_context_t ctx, struct vnode *dvp,
1530*d4514f0bSApple OSS Distributions     struct vnode *vp, struct componentname *cnp)
1531*d4514f0bSApple OSS Distributions {
1532*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1533*d4514f0bSApple OSS Distributions 	int error;
1534*d4514f0bSApple OSS Distributions 
1535*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1536*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1537*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1538*d4514f0bSApple OSS Distributions 		return 0;
1539*d4514f0bSApple OSS Distributions 	}
1540*d4514f0bSApple OSS Distributions #endif
1541*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1542*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1543*d4514f0bSApple OSS Distributions 		return 0;
1544*d4514f0bSApple OSS Distributions 	}
1545*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(48, vp);
1546*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_link, cred, dvp, mac_vnode_label(dvp), vp,
1547*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp), cnp);
1548*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(48, vp);
1549*d4514f0bSApple OSS Distributions 	return error;
1550*d4514f0bSApple OSS Distributions }
1551*d4514f0bSApple OSS Distributions 
1552*d4514f0bSApple OSS Distributions int
mac_vnode_check_listextattr(vfs_context_t ctx,struct vnode * vp)1553*d4514f0bSApple OSS Distributions mac_vnode_check_listextattr(vfs_context_t ctx, struct vnode *vp)
1554*d4514f0bSApple OSS Distributions {
1555*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1556*d4514f0bSApple OSS Distributions 	int error;
1557*d4514f0bSApple OSS Distributions 
1558*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1559*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1560*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1561*d4514f0bSApple OSS Distributions 		return 0;
1562*d4514f0bSApple OSS Distributions 	}
1563*d4514f0bSApple OSS Distributions #endif
1564*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1565*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1566*d4514f0bSApple OSS Distributions 		return 0;
1567*d4514f0bSApple OSS Distributions 	}
1568*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(49, vp);
1569*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_listextattr, cred, vp, mac_vnode_label(vp));
1570*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(49, vp);
1571*d4514f0bSApple OSS Distributions 	return error;
1572*d4514f0bSApple OSS Distributions }
1573*d4514f0bSApple OSS Distributions 
1574*d4514f0bSApple OSS Distributions int
mac_vnode_check_lookup_preflight(vfs_context_t ctx,struct vnode * dvp,const char * path,size_t pathlen)1575*d4514f0bSApple OSS Distributions mac_vnode_check_lookup_preflight(vfs_context_t ctx, struct vnode *dvp,
1576*d4514f0bSApple OSS Distributions     const char *path, size_t pathlen)
1577*d4514f0bSApple OSS Distributions {
1578*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1579*d4514f0bSApple OSS Distributions 	int error;
1580*d4514f0bSApple OSS Distributions 
1581*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1582*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1583*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1584*d4514f0bSApple OSS Distributions 		return 0;
1585*d4514f0bSApple OSS Distributions 	}
1586*d4514f0bSApple OSS Distributions #endif
1587*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1588*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1589*d4514f0bSApple OSS Distributions 		return 0;
1590*d4514f0bSApple OSS Distributions 	}
1591*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(50, dvp);
1592*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_lookup_preflight, cred, dvp, mac_vnode_label(dvp), path, pathlen);
1593*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(50, dvp);
1594*d4514f0bSApple OSS Distributions 	return error;
1595*d4514f0bSApple OSS Distributions }
1596*d4514f0bSApple OSS Distributions 
1597*d4514f0bSApple OSS Distributions int
mac_vnode_check_lookup(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp)1598*d4514f0bSApple OSS Distributions mac_vnode_check_lookup(vfs_context_t ctx, struct vnode *dvp,
1599*d4514f0bSApple OSS Distributions     struct componentname *cnp)
1600*d4514f0bSApple OSS Distributions {
1601*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1602*d4514f0bSApple OSS Distributions 	int error;
1603*d4514f0bSApple OSS Distributions 
1604*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1605*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1606*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1607*d4514f0bSApple OSS Distributions 		return 0;
1608*d4514f0bSApple OSS Distributions 	}
1609*d4514f0bSApple OSS Distributions #endif
1610*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1611*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1612*d4514f0bSApple OSS Distributions 		return 0;
1613*d4514f0bSApple OSS Distributions 	}
1614*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(51, dvp);
1615*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_lookup, cred, dvp, mac_vnode_label(dvp), cnp);
1616*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(51, dvp);
1617*d4514f0bSApple OSS Distributions 	return error;
1618*d4514f0bSApple OSS Distributions }
1619*d4514f0bSApple OSS Distributions 
1620*d4514f0bSApple OSS Distributions int
mac_vnode_check_open(vfs_context_t ctx,struct vnode * vp,int acc_mode)1621*d4514f0bSApple OSS Distributions mac_vnode_check_open(vfs_context_t ctx, struct vnode *vp, int acc_mode)
1622*d4514f0bSApple OSS Distributions {
1623*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1624*d4514f0bSApple OSS Distributions 	int error;
1625*d4514f0bSApple OSS Distributions 
1626*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1627*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1628*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1629*d4514f0bSApple OSS Distributions 		return 0;
1630*d4514f0bSApple OSS Distributions 	}
1631*d4514f0bSApple OSS Distributions #endif
1632*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1633*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1634*d4514f0bSApple OSS Distributions 		return 0;
1635*d4514f0bSApple OSS Distributions 	}
1636*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(52, vp);
1637*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_open, cred, vp, mac_vnode_label(vp), acc_mode);
1638*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(52, vp);
1639*d4514f0bSApple OSS Distributions 	return error;
1640*d4514f0bSApple OSS Distributions }
1641*d4514f0bSApple OSS Distributions 
1642*d4514f0bSApple OSS Distributions int
mac_vnode_check_read(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp)1643*d4514f0bSApple OSS Distributions mac_vnode_check_read(vfs_context_t ctx, struct ucred *file_cred,
1644*d4514f0bSApple OSS Distributions     struct vnode *vp)
1645*d4514f0bSApple OSS Distributions {
1646*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1647*d4514f0bSApple OSS Distributions 	int error;
1648*d4514f0bSApple OSS Distributions 
1649*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1650*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1651*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1652*d4514f0bSApple OSS Distributions 		return 0;
1653*d4514f0bSApple OSS Distributions 	}
1654*d4514f0bSApple OSS Distributions #endif
1655*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1656*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1657*d4514f0bSApple OSS Distributions 		return 0;
1658*d4514f0bSApple OSS Distributions 	}
1659*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(53, vp);
1660*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_read, cred, file_cred, vp,
1661*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp));
1662*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(53, vp);
1663*d4514f0bSApple OSS Distributions 
1664*d4514f0bSApple OSS Distributions 	return error;
1665*d4514f0bSApple OSS Distributions }
1666*d4514f0bSApple OSS Distributions 
1667*d4514f0bSApple OSS Distributions int
mac_vnode_check_readdir(vfs_context_t ctx,struct vnode * dvp)1668*d4514f0bSApple OSS Distributions mac_vnode_check_readdir(vfs_context_t ctx, struct vnode *dvp)
1669*d4514f0bSApple OSS Distributions {
1670*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1671*d4514f0bSApple OSS Distributions 	int error;
1672*d4514f0bSApple OSS Distributions 
1673*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1674*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1675*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1676*d4514f0bSApple OSS Distributions 		return 0;
1677*d4514f0bSApple OSS Distributions 	}
1678*d4514f0bSApple OSS Distributions #endif
1679*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1680*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1681*d4514f0bSApple OSS Distributions 		return 0;
1682*d4514f0bSApple OSS Distributions 	}
1683*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(54, dvp);
1684*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_readdir, cred, dvp, mac_vnode_label(dvp));
1685*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(54, dvp);
1686*d4514f0bSApple OSS Distributions 	return error;
1687*d4514f0bSApple OSS Distributions }
1688*d4514f0bSApple OSS Distributions 
1689*d4514f0bSApple OSS Distributions int
mac_vnode_check_readlink(vfs_context_t ctx,struct vnode * vp)1690*d4514f0bSApple OSS Distributions mac_vnode_check_readlink(vfs_context_t ctx, struct vnode *vp)
1691*d4514f0bSApple OSS Distributions {
1692*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1693*d4514f0bSApple OSS Distributions 	int error;
1694*d4514f0bSApple OSS Distributions 
1695*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1696*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1697*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1698*d4514f0bSApple OSS Distributions 		return 0;
1699*d4514f0bSApple OSS Distributions 	}
1700*d4514f0bSApple OSS Distributions #endif
1701*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1702*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1703*d4514f0bSApple OSS Distributions 		return 0;
1704*d4514f0bSApple OSS Distributions 	}
1705*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(55, vp);
1706*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_readlink, cred, vp, mac_vnode_label(vp));
1707*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(55, vp);
1708*d4514f0bSApple OSS Distributions 	return error;
1709*d4514f0bSApple OSS Distributions }
1710*d4514f0bSApple OSS Distributions 
1711*d4514f0bSApple OSS Distributions int
mac_vnode_check_label_update(vfs_context_t ctx,struct vnode * vp,struct label * newlabel)1712*d4514f0bSApple OSS Distributions mac_vnode_check_label_update(vfs_context_t ctx, struct vnode *vp,
1713*d4514f0bSApple OSS Distributions     struct label *newlabel)
1714*d4514f0bSApple OSS Distributions {
1715*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1716*d4514f0bSApple OSS Distributions 	int error;
1717*d4514f0bSApple OSS Distributions 
1718*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1719*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1720*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1721*d4514f0bSApple OSS Distributions 		return 0;
1722*d4514f0bSApple OSS Distributions 	}
1723*d4514f0bSApple OSS Distributions #endif
1724*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1725*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1726*d4514f0bSApple OSS Distributions 		return 0;
1727*d4514f0bSApple OSS Distributions 	}
1728*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(56, vp);
1729*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_label_update, cred, vp, mac_vnode_label(vp), newlabel);
1730*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(56, vp);
1731*d4514f0bSApple OSS Distributions 
1732*d4514f0bSApple OSS Distributions 	return error;
1733*d4514f0bSApple OSS Distributions }
1734*d4514f0bSApple OSS Distributions 
1735*d4514f0bSApple OSS Distributions int
mac_vnode_check_rename(vfs_context_t ctx,struct vnode * fdvp,struct vnode * fvp,struct componentname * fcnp,struct vnode * tdvp,struct vnode * tvp,struct componentname * tcnp)1736*d4514f0bSApple OSS Distributions mac_vnode_check_rename(vfs_context_t ctx, struct vnode *fdvp,
1737*d4514f0bSApple OSS Distributions     struct vnode *fvp, struct componentname *fcnp, struct vnode *tdvp,
1738*d4514f0bSApple OSS Distributions     struct vnode *tvp, struct componentname *tcnp)
1739*d4514f0bSApple OSS Distributions {
1740*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1741*d4514f0bSApple OSS Distributions 	int error;
1742*d4514f0bSApple OSS Distributions 
1743*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1744*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1745*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1746*d4514f0bSApple OSS Distributions 		return 0;
1747*d4514f0bSApple OSS Distributions 	}
1748*d4514f0bSApple OSS Distributions #endif
1749*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1750*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1751*d4514f0bSApple OSS Distributions 		return 0;
1752*d4514f0bSApple OSS Distributions 	}
1753*d4514f0bSApple OSS Distributions 
1754*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(57, fvp);
1755*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_rename_from, cred, fdvp, mac_vnode_label(fdvp), fvp, mac_vnode_label(fvp), fcnp);
1756*d4514f0bSApple OSS Distributions 	if (error) {
1757*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(57, fvp);
1758*d4514f0bSApple OSS Distributions 		return error;
1759*d4514f0bSApple OSS Distributions 	}
1760*d4514f0bSApple OSS Distributions 
1761*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_rename_to, cred, tdvp, mac_vnode_label(tdvp), tvp,
1762*d4514f0bSApple OSS Distributions 	    tvp != NULL ? mac_vnode_label(tvp) : NULL, fdvp == tdvp, tcnp);
1763*d4514f0bSApple OSS Distributions 	if (error) {
1764*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(57, fvp);
1765*d4514f0bSApple OSS Distributions 		return error;
1766*d4514f0bSApple OSS Distributions 	}
1767*d4514f0bSApple OSS Distributions 
1768*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_rename, cred, fdvp, mac_vnode_label(fdvp), fvp,
1769*d4514f0bSApple OSS Distributions 	    mac_vnode_label(fvp), fcnp, tdvp, mac_vnode_label(tdvp), tvp,
1770*d4514f0bSApple OSS Distributions 	    tvp != NULL ? mac_vnode_label(tvp) : NULL, tcnp);
1771*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(57, fvp);
1772*d4514f0bSApple OSS Distributions 	return error;
1773*d4514f0bSApple OSS Distributions }
1774*d4514f0bSApple OSS Distributions 
1775*d4514f0bSApple OSS Distributions int
mac_vnode_check_revoke(vfs_context_t ctx,struct vnode * vp)1776*d4514f0bSApple OSS Distributions mac_vnode_check_revoke(vfs_context_t ctx, struct vnode *vp)
1777*d4514f0bSApple OSS Distributions {
1778*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1779*d4514f0bSApple OSS Distributions 	int error;
1780*d4514f0bSApple OSS Distributions 
1781*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1782*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1783*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1784*d4514f0bSApple OSS Distributions 		return 0;
1785*d4514f0bSApple OSS Distributions 	}
1786*d4514f0bSApple OSS Distributions #endif
1787*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1788*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1789*d4514f0bSApple OSS Distributions 		return 0;
1790*d4514f0bSApple OSS Distributions 	}
1791*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(58, vp);
1792*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_revoke, cred, vp, mac_vnode_label(vp));
1793*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(58, vp);
1794*d4514f0bSApple OSS Distributions 	return error;
1795*d4514f0bSApple OSS Distributions }
1796*d4514f0bSApple OSS Distributions 
1797*d4514f0bSApple OSS Distributions int
mac_vnode_check_searchfs(vfs_context_t ctx,struct vnode * vp,struct attrlist * returnattrs,struct attrlist * searchattrs)1798*d4514f0bSApple OSS Distributions mac_vnode_check_searchfs(vfs_context_t ctx, struct vnode *vp, struct attrlist *returnattrs,
1799*d4514f0bSApple OSS Distributions     struct attrlist *searchattrs)
1800*d4514f0bSApple OSS Distributions {
1801*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1802*d4514f0bSApple OSS Distributions 	int error;
1803*d4514f0bSApple OSS Distributions 
1804*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1805*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1806*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1807*d4514f0bSApple OSS Distributions 		return 0;
1808*d4514f0bSApple OSS Distributions 	}
1809*d4514f0bSApple OSS Distributions #endif
1810*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1811*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1812*d4514f0bSApple OSS Distributions 		return 0;
1813*d4514f0bSApple OSS Distributions 	}
1814*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(59, vp);
1815*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_searchfs, cred, vp, mac_vnode_label(vp), returnattrs, searchattrs);
1816*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(59, vp);
1817*d4514f0bSApple OSS Distributions 	return error;
1818*d4514f0bSApple OSS Distributions }
1819*d4514f0bSApple OSS Distributions 
1820*d4514f0bSApple OSS Distributions int
mac_vnode_check_select(vfs_context_t ctx,struct vnode * vp,int which)1821*d4514f0bSApple OSS Distributions mac_vnode_check_select(vfs_context_t ctx, struct vnode *vp, int which)
1822*d4514f0bSApple OSS Distributions {
1823*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1824*d4514f0bSApple OSS Distributions 	int error;
1825*d4514f0bSApple OSS Distributions 
1826*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1827*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1828*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1829*d4514f0bSApple OSS Distributions 		return 0;
1830*d4514f0bSApple OSS Distributions 	}
1831*d4514f0bSApple OSS Distributions #endif
1832*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1833*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1834*d4514f0bSApple OSS Distributions 		return 0;
1835*d4514f0bSApple OSS Distributions 	}
1836*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(60, vp);
1837*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_select, cred, vp, mac_vnode_label(vp), which);
1838*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(60, vp);
1839*d4514f0bSApple OSS Distributions 	return error;
1840*d4514f0bSApple OSS Distributions }
1841*d4514f0bSApple OSS Distributions 
1842*d4514f0bSApple OSS Distributions int
mac_vnode_check_setacl(vfs_context_t ctx,struct vnode * vp,struct kauth_acl * acl)1843*d4514f0bSApple OSS Distributions mac_vnode_check_setacl(vfs_context_t ctx, struct vnode *vp,
1844*d4514f0bSApple OSS Distributions     struct kauth_acl *acl)
1845*d4514f0bSApple OSS Distributions {
1846*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1847*d4514f0bSApple OSS Distributions 	int error;
1848*d4514f0bSApple OSS Distributions 
1849*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1850*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1851*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1852*d4514f0bSApple OSS Distributions 		return 0;
1853*d4514f0bSApple OSS Distributions 	}
1854*d4514f0bSApple OSS Distributions #endif
1855*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1856*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1857*d4514f0bSApple OSS Distributions 		return 0;
1858*d4514f0bSApple OSS Distributions 	}
1859*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(61, vp);
1860*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_setacl, cred, vp, mac_vnode_label(vp), acl);
1861*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(61, vp);
1862*d4514f0bSApple OSS Distributions 	return error;
1863*d4514f0bSApple OSS Distributions }
1864*d4514f0bSApple OSS Distributions 
1865*d4514f0bSApple OSS Distributions int
mac_vnode_check_setattrlist(vfs_context_t ctx,struct vnode * vp,struct attrlist * alist)1866*d4514f0bSApple OSS Distributions mac_vnode_check_setattrlist(vfs_context_t ctx, struct vnode *vp,
1867*d4514f0bSApple OSS Distributions     struct attrlist *alist)
1868*d4514f0bSApple OSS Distributions {
1869*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1870*d4514f0bSApple OSS Distributions 	int error;
1871*d4514f0bSApple OSS Distributions 
1872*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1873*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1874*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1875*d4514f0bSApple OSS Distributions 		return 0;
1876*d4514f0bSApple OSS Distributions 	}
1877*d4514f0bSApple OSS Distributions #endif
1878*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1879*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1880*d4514f0bSApple OSS Distributions 		return 0;
1881*d4514f0bSApple OSS Distributions 	}
1882*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(62, vp);
1883*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_setattrlist, cred, vp, mac_vnode_label(vp), alist);
1884*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(62, vp);
1885*d4514f0bSApple OSS Distributions 	return error;
1886*d4514f0bSApple OSS Distributions }
1887*d4514f0bSApple OSS Distributions 
1888*d4514f0bSApple OSS Distributions int
mac_vnode_check_setextattr(vfs_context_t ctx,struct vnode * vp,const char * name,struct uio * uio)1889*d4514f0bSApple OSS Distributions mac_vnode_check_setextattr(vfs_context_t ctx, struct vnode *vp,
1890*d4514f0bSApple OSS Distributions     const char *name, struct uio *uio)
1891*d4514f0bSApple OSS Distributions {
1892*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1893*d4514f0bSApple OSS Distributions 	int error;
1894*d4514f0bSApple OSS Distributions 
1895*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1896*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1897*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1898*d4514f0bSApple OSS Distributions 		return 0;
1899*d4514f0bSApple OSS Distributions 	}
1900*d4514f0bSApple OSS Distributions #endif
1901*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1902*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1903*d4514f0bSApple OSS Distributions 		return 0;
1904*d4514f0bSApple OSS Distributions 	}
1905*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(63, vp);
1906*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_setextattr, cred, vp, mac_vnode_label(vp),
1907*d4514f0bSApple OSS Distributions 	    name, uio);
1908*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(63, vp);
1909*d4514f0bSApple OSS Distributions 	return error;
1910*d4514f0bSApple OSS Distributions }
1911*d4514f0bSApple OSS Distributions 
1912*d4514f0bSApple OSS Distributions int
mac_vnode_check_setflags(vfs_context_t ctx,struct vnode * vp,u_long flags)1913*d4514f0bSApple OSS Distributions mac_vnode_check_setflags(vfs_context_t ctx, struct vnode *vp, u_long flags)
1914*d4514f0bSApple OSS Distributions {
1915*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1916*d4514f0bSApple OSS Distributions 	int error;
1917*d4514f0bSApple OSS Distributions 
1918*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1919*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1920*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1921*d4514f0bSApple OSS Distributions 		return 0;
1922*d4514f0bSApple OSS Distributions 	}
1923*d4514f0bSApple OSS Distributions #endif
1924*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1925*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1926*d4514f0bSApple OSS Distributions 		return 0;
1927*d4514f0bSApple OSS Distributions 	}
1928*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(64, vp);
1929*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_setflags, cred, vp, mac_vnode_label(vp), flags);
1930*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(64, vp);
1931*d4514f0bSApple OSS Distributions 	return error;
1932*d4514f0bSApple OSS Distributions }
1933*d4514f0bSApple OSS Distributions 
1934*d4514f0bSApple OSS Distributions int
mac_vnode_check_setmode(vfs_context_t ctx,struct vnode * vp,mode_t mode)1935*d4514f0bSApple OSS Distributions mac_vnode_check_setmode(vfs_context_t ctx, struct vnode *vp, mode_t mode)
1936*d4514f0bSApple OSS Distributions {
1937*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1938*d4514f0bSApple OSS Distributions 	int error;
1939*d4514f0bSApple OSS Distributions 
1940*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1941*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1942*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1943*d4514f0bSApple OSS Distributions 		return 0;
1944*d4514f0bSApple OSS Distributions 	}
1945*d4514f0bSApple OSS Distributions #endif
1946*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1947*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1948*d4514f0bSApple OSS Distributions 		return 0;
1949*d4514f0bSApple OSS Distributions 	}
1950*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(65, vp);
1951*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_setmode, cred, vp, mac_vnode_label(vp), mode);
1952*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(65, vp);
1953*d4514f0bSApple OSS Distributions 	return error;
1954*d4514f0bSApple OSS Distributions }
1955*d4514f0bSApple OSS Distributions 
1956*d4514f0bSApple OSS Distributions int
mac_vnode_check_setowner(vfs_context_t ctx,struct vnode * vp,uid_t uid,gid_t gid)1957*d4514f0bSApple OSS Distributions mac_vnode_check_setowner(vfs_context_t ctx, struct vnode *vp, uid_t uid,
1958*d4514f0bSApple OSS Distributions     gid_t gid)
1959*d4514f0bSApple OSS Distributions {
1960*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1961*d4514f0bSApple OSS Distributions 	int error;
1962*d4514f0bSApple OSS Distributions 
1963*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1964*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1965*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1966*d4514f0bSApple OSS Distributions 		return 0;
1967*d4514f0bSApple OSS Distributions 	}
1968*d4514f0bSApple OSS Distributions #endif
1969*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1970*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1971*d4514f0bSApple OSS Distributions 		return 0;
1972*d4514f0bSApple OSS Distributions 	}
1973*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(66, vp);
1974*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_setowner, cred, vp, mac_vnode_label(vp), uid, gid);
1975*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(66, vp);
1976*d4514f0bSApple OSS Distributions 	return error;
1977*d4514f0bSApple OSS Distributions }
1978*d4514f0bSApple OSS Distributions 
1979*d4514f0bSApple OSS Distributions int
mac_vnode_check_setutimes(vfs_context_t ctx,struct vnode * vp,struct timespec atime,struct timespec mtime)1980*d4514f0bSApple OSS Distributions mac_vnode_check_setutimes(vfs_context_t ctx, struct vnode *vp,
1981*d4514f0bSApple OSS Distributions     struct timespec atime, struct timespec mtime)
1982*d4514f0bSApple OSS Distributions {
1983*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
1984*d4514f0bSApple OSS Distributions 	int error;
1985*d4514f0bSApple OSS Distributions 
1986*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1987*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
1988*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
1989*d4514f0bSApple OSS Distributions 		return 0;
1990*d4514f0bSApple OSS Distributions 	}
1991*d4514f0bSApple OSS Distributions #endif
1992*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1993*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1994*d4514f0bSApple OSS Distributions 		return 0;
1995*d4514f0bSApple OSS Distributions 	}
1996*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(67, vp);
1997*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_setutimes, cred, vp, mac_vnode_label(vp), atime,
1998*d4514f0bSApple OSS Distributions 	    mtime);
1999*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(67, vp);
2000*d4514f0bSApple OSS Distributions 	return error;
2001*d4514f0bSApple OSS Distributions }
2002*d4514f0bSApple OSS Distributions 
2003*d4514f0bSApple OSS Distributions int
mac_vnode_check_stat(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp)2004*d4514f0bSApple OSS Distributions mac_vnode_check_stat(vfs_context_t ctx, struct ucred *file_cred,
2005*d4514f0bSApple OSS Distributions     struct vnode *vp)
2006*d4514f0bSApple OSS Distributions {
2007*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2008*d4514f0bSApple OSS Distributions 	int error;
2009*d4514f0bSApple OSS Distributions 
2010*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2011*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2012*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2013*d4514f0bSApple OSS Distributions 		return 0;
2014*d4514f0bSApple OSS Distributions 	}
2015*d4514f0bSApple OSS Distributions #endif
2016*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2017*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2018*d4514f0bSApple OSS Distributions 		return 0;
2019*d4514f0bSApple OSS Distributions 	}
2020*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(68, vp);
2021*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_stat, cred, file_cred, vp,
2022*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp));
2023*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(68, vp);
2024*d4514f0bSApple OSS Distributions 	return error;
2025*d4514f0bSApple OSS Distributions }
2026*d4514f0bSApple OSS Distributions 
2027*d4514f0bSApple OSS Distributions int
mac_vnode_check_trigger_resolve(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp)2028*d4514f0bSApple OSS Distributions mac_vnode_check_trigger_resolve(vfs_context_t ctx, struct vnode *dvp,
2029*d4514f0bSApple OSS Distributions     struct componentname *cnp)
2030*d4514f0bSApple OSS Distributions {
2031*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2032*d4514f0bSApple OSS Distributions 	int error;
2033*d4514f0bSApple OSS Distributions 
2034*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2035*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2036*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2037*d4514f0bSApple OSS Distributions 		return 0;
2038*d4514f0bSApple OSS Distributions 	}
2039*d4514f0bSApple OSS Distributions #endif
2040*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2041*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2042*d4514f0bSApple OSS Distributions 		return 0;
2043*d4514f0bSApple OSS Distributions 	}
2044*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(69, dvp);
2045*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_trigger_resolve, cred, dvp, mac_vnode_label(dvp), cnp);
2046*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(69, dvp);
2047*d4514f0bSApple OSS Distributions 	return error;
2048*d4514f0bSApple OSS Distributions }
2049*d4514f0bSApple OSS Distributions 
2050*d4514f0bSApple OSS Distributions int
mac_vnode_check_truncate(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp)2051*d4514f0bSApple OSS Distributions mac_vnode_check_truncate(vfs_context_t ctx, struct ucred *file_cred,
2052*d4514f0bSApple OSS Distributions     struct vnode *vp)
2053*d4514f0bSApple OSS Distributions {
2054*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2055*d4514f0bSApple OSS Distributions 	int error;
2056*d4514f0bSApple OSS Distributions 
2057*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2058*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2059*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2060*d4514f0bSApple OSS Distributions 		return 0;
2061*d4514f0bSApple OSS Distributions 	}
2062*d4514f0bSApple OSS Distributions #endif
2063*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2064*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2065*d4514f0bSApple OSS Distributions 		return 0;
2066*d4514f0bSApple OSS Distributions 	}
2067*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(70, vp);
2068*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_truncate, cred, file_cred, vp,
2069*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp));
2070*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(70, vp);
2071*d4514f0bSApple OSS Distributions 
2072*d4514f0bSApple OSS Distributions 	return error;
2073*d4514f0bSApple OSS Distributions }
2074*d4514f0bSApple OSS Distributions 
2075*d4514f0bSApple OSS Distributions int
mac_vnode_check_write(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp)2076*d4514f0bSApple OSS Distributions mac_vnode_check_write(vfs_context_t ctx, struct ucred *file_cred,
2077*d4514f0bSApple OSS Distributions     struct vnode *vp)
2078*d4514f0bSApple OSS Distributions {
2079*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2080*d4514f0bSApple OSS Distributions 	int error;
2081*d4514f0bSApple OSS Distributions 
2082*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2083*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2084*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2085*d4514f0bSApple OSS Distributions 		return 0;
2086*d4514f0bSApple OSS Distributions 	}
2087*d4514f0bSApple OSS Distributions #endif
2088*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2089*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2090*d4514f0bSApple OSS Distributions 		return 0;
2091*d4514f0bSApple OSS Distributions 	}
2092*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(71, vp);
2093*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_write, cred, file_cred, vp, mac_vnode_label(vp));
2094*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(71, vp);
2095*d4514f0bSApple OSS Distributions 
2096*d4514f0bSApple OSS Distributions 	return error;
2097*d4514f0bSApple OSS Distributions }
2098*d4514f0bSApple OSS Distributions 
2099*d4514f0bSApple OSS Distributions int
mac_vnode_check_uipc_bind(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp,struct vnode_attr * vap)2100*d4514f0bSApple OSS Distributions mac_vnode_check_uipc_bind(vfs_context_t ctx, struct vnode *dvp,
2101*d4514f0bSApple OSS Distributions     struct componentname *cnp, struct vnode_attr *vap)
2102*d4514f0bSApple OSS Distributions {
2103*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2104*d4514f0bSApple OSS Distributions 	int error;
2105*d4514f0bSApple OSS Distributions 
2106*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2107*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2108*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2109*d4514f0bSApple OSS Distributions 		return 0;
2110*d4514f0bSApple OSS Distributions 	}
2111*d4514f0bSApple OSS Distributions #endif
2112*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2113*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2114*d4514f0bSApple OSS Distributions 		return 0;
2115*d4514f0bSApple OSS Distributions 	}
2116*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(72, dvp);
2117*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_uipc_bind, cred, dvp, mac_vnode_label(dvp), cnp, vap);
2118*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(72, dvp);
2119*d4514f0bSApple OSS Distributions 	return error;
2120*d4514f0bSApple OSS Distributions }
2121*d4514f0bSApple OSS Distributions 
2122*d4514f0bSApple OSS Distributions int
mac_vnode_check_uipc_connect(vfs_context_t ctx,struct vnode * vp,struct socket * so)2123*d4514f0bSApple OSS Distributions mac_vnode_check_uipc_connect(vfs_context_t ctx, struct vnode *vp, struct socket *so)
2124*d4514f0bSApple OSS Distributions {
2125*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2126*d4514f0bSApple OSS Distributions 	int error;
2127*d4514f0bSApple OSS Distributions 
2128*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2129*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2130*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2131*d4514f0bSApple OSS Distributions 		return 0;
2132*d4514f0bSApple OSS Distributions 	}
2133*d4514f0bSApple OSS Distributions #endif
2134*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2135*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2136*d4514f0bSApple OSS Distributions 		return 0;
2137*d4514f0bSApple OSS Distributions 	}
2138*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(73, vp);
2139*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_uipc_connect, cred, vp, mac_vnode_label(vp), (socket_t) so);
2140*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(73, vp);
2141*d4514f0bSApple OSS Distributions 	return error;
2142*d4514f0bSApple OSS Distributions }
2143*d4514f0bSApple OSS Distributions 
2144*d4514f0bSApple OSS Distributions void
mac_vnode_label_update(vfs_context_t ctx,struct vnode * vp,struct label * newlabel)2145*d4514f0bSApple OSS Distributions mac_vnode_label_update(vfs_context_t ctx, struct vnode *vp, struct label *newlabel)
2146*d4514f0bSApple OSS Distributions {
2147*d4514f0bSApple OSS Distributions 	kauth_cred_t cred = vfs_context_ucred(ctx);
2148*d4514f0bSApple OSS Distributions 	struct label *tmpl = NULL;
2149*d4514f0bSApple OSS Distributions 
2150*d4514f0bSApple OSS Distributions 	if (mac_vnode_label(vp) == NULL) {
2151*d4514f0bSApple OSS Distributions 		tmpl = mac_vnode_label_alloc(vp);
2152*d4514f0bSApple OSS Distributions 	}
2153*d4514f0bSApple OSS Distributions 
2154*d4514f0bSApple OSS Distributions 	vnode_lock(vp);
2155*d4514f0bSApple OSS Distributions 
2156*d4514f0bSApple OSS Distributions 	/*
2157*d4514f0bSApple OSS Distributions 	 * Recheck under lock.  We allocate labels for vnodes lazily, so
2158*d4514f0bSApple OSS Distributions 	 * somebody else might have already got here first.
2159*d4514f0bSApple OSS Distributions 	 */
2160*d4514f0bSApple OSS Distributions 	if (mac_vnode_label(vp) == NULL) {
2161*d4514f0bSApple OSS Distributions 		vp->v_label = tmpl;
2162*d4514f0bSApple OSS Distributions 		tmpl = NULL;
2163*d4514f0bSApple OSS Distributions 	}
2164*d4514f0bSApple OSS Distributions 
2165*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(74, vp);
2166*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_label_update, cred, vp, mac_vnode_label(vp), newlabel);
2167*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(74, vp);
2168*d4514f0bSApple OSS Distributions 	vnode_unlock(vp);
2169*d4514f0bSApple OSS Distributions 
2170*d4514f0bSApple OSS Distributions 	if (tmpl != NULL) {
2171*d4514f0bSApple OSS Distributions 		mac_vnode_label_free(tmpl);
2172*d4514f0bSApple OSS Distributions 	}
2173*d4514f0bSApple OSS Distributions }
2174*d4514f0bSApple OSS Distributions 
2175*d4514f0bSApple OSS Distributions int
mac_vnode_find_sigs(struct proc * p,struct vnode * vp,off_t offset)2176*d4514f0bSApple OSS Distributions mac_vnode_find_sigs(struct proc *p, struct vnode *vp, off_t offset)
2177*d4514f0bSApple OSS Distributions {
2178*d4514f0bSApple OSS Distributions 	int error;
2179*d4514f0bSApple OSS Distributions 
2180*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2181*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2182*d4514f0bSApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
2183*d4514f0bSApple OSS Distributions 		return 0;
2184*d4514f0bSApple OSS Distributions 	}
2185*d4514f0bSApple OSS Distributions #endif
2186*d4514f0bSApple OSS Distributions 
2187*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(75, vp);
2188*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_find_sigs, p, vp, offset, mac_vnode_label(vp));
2189*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(75, vp);
2190*d4514f0bSApple OSS Distributions 
2191*d4514f0bSApple OSS Distributions 	return error;
2192*d4514f0bSApple OSS Distributions }
2193*d4514f0bSApple OSS Distributions 
2194*d4514f0bSApple OSS Distributions void
mac_mount_label_associate(vfs_context_t ctx,struct mount * mp)2195*d4514f0bSApple OSS Distributions mac_mount_label_associate(vfs_context_t ctx, struct mount *mp)
2196*d4514f0bSApple OSS Distributions {
2197*d4514f0bSApple OSS Distributions 	kauth_cred_t cred = vfs_context_ucred(ctx);
2198*d4514f0bSApple OSS Distributions 
2199*d4514f0bSApple OSS Distributions 	/* XXX: eventually this logic may be handled by the policy? */
2200*d4514f0bSApple OSS Distributions 
2201*d4514f0bSApple OSS Distributions 	/* We desire MULTILABEL for the root filesystem. */
2202*d4514f0bSApple OSS Distributions 	if ((mp->mnt_flag & MNT_ROOTFS) &&
2203*d4514f0bSApple OSS Distributions 	    (strcmp(mp->mnt_vfsstat.f_fstypename, "hfs") == 0)) {
2204*d4514f0bSApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2205*d4514f0bSApple OSS Distributions 	}
2206*d4514f0bSApple OSS Distributions 
2207*d4514f0bSApple OSS Distributions 	/* MULTILABEL on DEVFS. */
2208*d4514f0bSApple OSS Distributions 	if (strcmp(mp->mnt_vfsstat.f_fstypename, "devfs") == 0) {
2209*d4514f0bSApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2210*d4514f0bSApple OSS Distributions 	}
2211*d4514f0bSApple OSS Distributions 
2212*d4514f0bSApple OSS Distributions 	/* MULTILABEL on FDESC pseudo-filesystem. */
2213*d4514f0bSApple OSS Distributions 	if (strcmp(mp->mnt_vfsstat.f_fstypename, "fdesc") == 0) {
2214*d4514f0bSApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2215*d4514f0bSApple OSS Distributions 	}
2216*d4514f0bSApple OSS Distributions 
2217*d4514f0bSApple OSS Distributions 	/* MULTILABEL on all NFS filesystems. */
2218*d4514f0bSApple OSS Distributions 	if (strcmp(mp->mnt_vfsstat.f_fstypename, "nfs") == 0) {
2219*d4514f0bSApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2220*d4514f0bSApple OSS Distributions 	}
2221*d4514f0bSApple OSS Distributions 
2222*d4514f0bSApple OSS Distributions 	/* MULTILABEL on all AFP filesystems. */
2223*d4514f0bSApple OSS Distributions 	if (strcmp(mp->mnt_vfsstat.f_fstypename, "afpfs") == 0) {
2224*d4514f0bSApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2225*d4514f0bSApple OSS Distributions 	}
2226*d4514f0bSApple OSS Distributions 
2227*d4514f0bSApple OSS Distributions 	if (mp->mnt_vtable != NULL) {
2228*d4514f0bSApple OSS Distributions 		/* Any filesystem that supports native XATTRs. */
2229*d4514f0bSApple OSS Distributions 		if ((mp->mnt_vtable->vfc_vfsflags & VFC_VFSNATIVEXATTR)) {
2230*d4514f0bSApple OSS Distributions 			mp->mnt_flag |= MNT_MULTILABEL;
2231*d4514f0bSApple OSS Distributions 		}
2232*d4514f0bSApple OSS Distributions 
2233*d4514f0bSApple OSS Distributions 		/* Filesystem does not support multilabel. */
2234*d4514f0bSApple OSS Distributions 		if ((mp->mnt_vtable->vfc_vfsflags & VFC_VFSNOMACLABEL) &&
2235*d4514f0bSApple OSS Distributions 		    (mp->mnt_flag & MNT_MULTILABEL)) {
2236*d4514f0bSApple OSS Distributions 			mp->mnt_flag &= ~MNT_MULTILABEL;
2237*d4514f0bSApple OSS Distributions 		}
2238*d4514f0bSApple OSS Distributions 	}
2239*d4514f0bSApple OSS Distributions 
2240*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(76, mp);
2241*d4514f0bSApple OSS Distributions 	MAC_PERFORM(mount_label_associate, cred, mp, mac_mount_label(mp));
2242*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(76, mp);
2243*d4514f0bSApple OSS Distributions #if DEBUG
2244*d4514f0bSApple OSS Distributions 	printf("MAC Framework enabling %s support: %s -> %s (%s)\n",
2245*d4514f0bSApple OSS Distributions 	    mp->mnt_flag & MNT_MULTILABEL ? "multilabel" : "singlelabel",
2246*d4514f0bSApple OSS Distributions 	    mp->mnt_vfsstat.f_mntfromname,
2247*d4514f0bSApple OSS Distributions 	    mp->mnt_vfsstat.f_mntonname,
2248*d4514f0bSApple OSS Distributions 	    mp->mnt_vfsstat.f_fstypename);
2249*d4514f0bSApple OSS Distributions #endif
2250*d4514f0bSApple OSS Distributions }
2251*d4514f0bSApple OSS Distributions 
2252*d4514f0bSApple OSS Distributions int
mac_mount_check_mount(vfs_context_t ctx,struct vnode * vp,struct componentname * cnp,const char * vfc_name)2253*d4514f0bSApple OSS Distributions mac_mount_check_mount(vfs_context_t ctx, struct vnode *vp,
2254*d4514f0bSApple OSS Distributions     struct componentname *cnp, const char *vfc_name)
2255*d4514f0bSApple OSS Distributions {
2256*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2257*d4514f0bSApple OSS Distributions 	int error;
2258*d4514f0bSApple OSS Distributions 
2259*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2260*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2261*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2262*d4514f0bSApple OSS Distributions 		return 0;
2263*d4514f0bSApple OSS Distributions 	}
2264*d4514f0bSApple OSS Distributions #endif
2265*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2266*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2267*d4514f0bSApple OSS Distributions 		return 0;
2268*d4514f0bSApple OSS Distributions 	}
2269*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(77, vp);
2270*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_mount, cred, vp, mac_vnode_label(vp), cnp, vfc_name);
2271*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(77, vp);
2272*d4514f0bSApple OSS Distributions 
2273*d4514f0bSApple OSS Distributions 	return error;
2274*d4514f0bSApple OSS Distributions }
2275*d4514f0bSApple OSS Distributions 
2276*d4514f0bSApple OSS Distributions int
mac_mount_check_mount_late(vfs_context_t ctx,struct mount * mp)2277*d4514f0bSApple OSS Distributions mac_mount_check_mount_late(vfs_context_t ctx, struct mount *mp)
2278*d4514f0bSApple OSS Distributions {
2279*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2280*d4514f0bSApple OSS Distributions 	int error;
2281*d4514f0bSApple OSS Distributions 
2282*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2283*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2284*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2285*d4514f0bSApple OSS Distributions 		return 0;
2286*d4514f0bSApple OSS Distributions 	}
2287*d4514f0bSApple OSS Distributions #endif
2288*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2289*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2290*d4514f0bSApple OSS Distributions 		return 0;
2291*d4514f0bSApple OSS Distributions 	}
2292*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(78, mp);
2293*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_mount_late, cred, mp);
2294*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(78, mp);
2295*d4514f0bSApple OSS Distributions 
2296*d4514f0bSApple OSS Distributions 	return error;
2297*d4514f0bSApple OSS Distributions }
2298*d4514f0bSApple OSS Distributions 
2299*d4514f0bSApple OSS Distributions int
mac_mount_check_snapshot_create(vfs_context_t ctx,struct mount * mp,const char * name)2300*d4514f0bSApple OSS Distributions mac_mount_check_snapshot_create(vfs_context_t ctx, struct mount *mp,
2301*d4514f0bSApple OSS Distributions     const char *name)
2302*d4514f0bSApple OSS Distributions {
2303*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2304*d4514f0bSApple OSS Distributions 	int error;
2305*d4514f0bSApple OSS Distributions 
2306*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2307*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2308*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2309*d4514f0bSApple OSS Distributions 		return 0;
2310*d4514f0bSApple OSS Distributions 	}
2311*d4514f0bSApple OSS Distributions #endif
2312*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2313*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2314*d4514f0bSApple OSS Distributions 		return 0;
2315*d4514f0bSApple OSS Distributions 	}
2316*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(79, mp);
2317*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_snapshot_create, cred, mp, name);
2318*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(79, mp);
2319*d4514f0bSApple OSS Distributions 	return error;
2320*d4514f0bSApple OSS Distributions }
2321*d4514f0bSApple OSS Distributions 
2322*d4514f0bSApple OSS Distributions int
mac_mount_check_snapshot_delete(vfs_context_t ctx,struct mount * mp,const char * name)2323*d4514f0bSApple OSS Distributions mac_mount_check_snapshot_delete(vfs_context_t ctx, struct mount *mp,
2324*d4514f0bSApple OSS Distributions     const char *name)
2325*d4514f0bSApple OSS Distributions {
2326*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2327*d4514f0bSApple OSS Distributions 	int error;
2328*d4514f0bSApple OSS Distributions 
2329*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2330*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2331*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2332*d4514f0bSApple OSS Distributions 		return 0;
2333*d4514f0bSApple OSS Distributions 	}
2334*d4514f0bSApple OSS Distributions #endif
2335*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2336*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2337*d4514f0bSApple OSS Distributions 		return 0;
2338*d4514f0bSApple OSS Distributions 	}
2339*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(80, mp);
2340*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_snapshot_delete, cred, mp, name);
2341*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(80, mp);
2342*d4514f0bSApple OSS Distributions 	return error;
2343*d4514f0bSApple OSS Distributions }
2344*d4514f0bSApple OSS Distributions 
2345*d4514f0bSApple OSS Distributions int
mac_mount_check_snapshot_mount(vfs_context_t ctx,struct vnode * rvp,struct vnode * vp,struct componentname * cnp,const char * name,const char * vfc_name)2346*d4514f0bSApple OSS Distributions mac_mount_check_snapshot_mount(vfs_context_t ctx, struct vnode *rvp, struct vnode *vp, struct componentname *cnp,
2347*d4514f0bSApple OSS Distributions     const char *name, const char *vfc_name)
2348*d4514f0bSApple OSS Distributions {
2349*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2350*d4514f0bSApple OSS Distributions 	int error;
2351*d4514f0bSApple OSS Distributions 
2352*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2353*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2354*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2355*d4514f0bSApple OSS Distributions 		return 0;
2356*d4514f0bSApple OSS Distributions 	}
2357*d4514f0bSApple OSS Distributions #endif
2358*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2359*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2360*d4514f0bSApple OSS Distributions 		return 0;
2361*d4514f0bSApple OSS Distributions 	}
2362*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(92, vp);
2363*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_snapshot_mount, cred, rvp, vp, cnp, name, vfc_name);
2364*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(92, vp);
2365*d4514f0bSApple OSS Distributions 	return error;
2366*d4514f0bSApple OSS Distributions }
2367*d4514f0bSApple OSS Distributions 
2368*d4514f0bSApple OSS Distributions int
mac_mount_check_snapshot_revert(vfs_context_t ctx,struct mount * mp,const char * name)2369*d4514f0bSApple OSS Distributions mac_mount_check_snapshot_revert(vfs_context_t ctx, struct mount *mp,
2370*d4514f0bSApple OSS Distributions     const char *name)
2371*d4514f0bSApple OSS Distributions {
2372*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2373*d4514f0bSApple OSS Distributions 	int error;
2374*d4514f0bSApple OSS Distributions 
2375*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2376*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2377*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2378*d4514f0bSApple OSS Distributions 		return 0;
2379*d4514f0bSApple OSS Distributions 	}
2380*d4514f0bSApple OSS Distributions #endif
2381*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2382*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2383*d4514f0bSApple OSS Distributions 		return 0;
2384*d4514f0bSApple OSS Distributions 	}
2385*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(81, mp);
2386*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_snapshot_revert, cred, mp, name);
2387*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(81, mp);
2388*d4514f0bSApple OSS Distributions 	return error;
2389*d4514f0bSApple OSS Distributions }
2390*d4514f0bSApple OSS Distributions 
2391*d4514f0bSApple OSS Distributions int
mac_mount_check_remount(vfs_context_t ctx,struct mount * mp,int flags)2392*d4514f0bSApple OSS Distributions mac_mount_check_remount(vfs_context_t ctx, struct mount *mp, int flags)
2393*d4514f0bSApple OSS Distributions {
2394*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2395*d4514f0bSApple OSS Distributions 	int error;
2396*d4514f0bSApple OSS Distributions 	uint64_t visflags = (uint64_t)(flags & (MNT_CMDFLAGS | MNT_VISFLAGMASK));
2397*d4514f0bSApple OSS Distributions 
2398*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2399*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2400*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2401*d4514f0bSApple OSS Distributions 		return 0;
2402*d4514f0bSApple OSS Distributions 	}
2403*d4514f0bSApple OSS Distributions #endif
2404*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2405*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2406*d4514f0bSApple OSS Distributions 		return 0;
2407*d4514f0bSApple OSS Distributions 	}
2408*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(82, mp);
2409*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_remount, cred, mp, mac_mount_label(mp), visflags);
2410*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(82, mp);
2411*d4514f0bSApple OSS Distributions 
2412*d4514f0bSApple OSS Distributions 	return error;
2413*d4514f0bSApple OSS Distributions }
2414*d4514f0bSApple OSS Distributions 
2415*d4514f0bSApple OSS Distributions int
mac_mount_check_umount(vfs_context_t ctx,struct mount * mp)2416*d4514f0bSApple OSS Distributions mac_mount_check_umount(vfs_context_t ctx, struct mount *mp)
2417*d4514f0bSApple OSS Distributions {
2418*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2419*d4514f0bSApple OSS Distributions 	int error;
2420*d4514f0bSApple OSS Distributions 
2421*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2422*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2423*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2424*d4514f0bSApple OSS Distributions 		return 0;
2425*d4514f0bSApple OSS Distributions 	}
2426*d4514f0bSApple OSS Distributions #endif
2427*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2428*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2429*d4514f0bSApple OSS Distributions 		return 0;
2430*d4514f0bSApple OSS Distributions 	}
2431*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(83, mp);
2432*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_umount, cred, mp, mac_mount_label(mp));
2433*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(83, mp);
2434*d4514f0bSApple OSS Distributions 
2435*d4514f0bSApple OSS Distributions 	return error;
2436*d4514f0bSApple OSS Distributions }
2437*d4514f0bSApple OSS Distributions 
2438*d4514f0bSApple OSS Distributions int
mac_mount_check_getattr(vfs_context_t ctx,struct mount * mp,struct vfs_attr * vfa)2439*d4514f0bSApple OSS Distributions mac_mount_check_getattr(vfs_context_t ctx, struct mount *mp,
2440*d4514f0bSApple OSS Distributions     struct vfs_attr *vfa)
2441*d4514f0bSApple OSS Distributions {
2442*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2443*d4514f0bSApple OSS Distributions 	int error;
2444*d4514f0bSApple OSS Distributions 
2445*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2446*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2447*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2448*d4514f0bSApple OSS Distributions 		return 0;
2449*d4514f0bSApple OSS Distributions 	}
2450*d4514f0bSApple OSS Distributions #endif
2451*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2452*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2453*d4514f0bSApple OSS Distributions 		return 0;
2454*d4514f0bSApple OSS Distributions 	}
2455*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(84, mp);
2456*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_getattr, cred, mp, mac_mount_label(mp), vfa);
2457*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(84, mp);
2458*d4514f0bSApple OSS Distributions 	return error;
2459*d4514f0bSApple OSS Distributions }
2460*d4514f0bSApple OSS Distributions 
2461*d4514f0bSApple OSS Distributions int
mac_mount_check_setattr(vfs_context_t ctx,struct mount * mp,struct vfs_attr * vfa)2462*d4514f0bSApple OSS Distributions mac_mount_check_setattr(vfs_context_t ctx, struct mount *mp,
2463*d4514f0bSApple OSS Distributions     struct vfs_attr *vfa)
2464*d4514f0bSApple OSS Distributions {
2465*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2466*d4514f0bSApple OSS Distributions 	int error;
2467*d4514f0bSApple OSS Distributions 
2468*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2469*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2470*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2471*d4514f0bSApple OSS Distributions 		return 0;
2472*d4514f0bSApple OSS Distributions 	}
2473*d4514f0bSApple OSS Distributions #endif
2474*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2475*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2476*d4514f0bSApple OSS Distributions 		return 0;
2477*d4514f0bSApple OSS Distributions 	}
2478*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(85, mp);
2479*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_setattr, cred, mp, mac_mount_label(mp), vfa);
2480*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(85, mp);
2481*d4514f0bSApple OSS Distributions 	return error;
2482*d4514f0bSApple OSS Distributions }
2483*d4514f0bSApple OSS Distributions 
2484*d4514f0bSApple OSS Distributions int
mac_mount_check_stat(vfs_context_t ctx,struct mount * mount)2485*d4514f0bSApple OSS Distributions mac_mount_check_stat(vfs_context_t ctx, struct mount *mount)
2486*d4514f0bSApple OSS Distributions {
2487*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2488*d4514f0bSApple OSS Distributions 	int error;
2489*d4514f0bSApple OSS Distributions 
2490*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2491*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2492*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2493*d4514f0bSApple OSS Distributions 		return 0;
2494*d4514f0bSApple OSS Distributions 	}
2495*d4514f0bSApple OSS Distributions #endif
2496*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2497*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2498*d4514f0bSApple OSS Distributions 		return 0;
2499*d4514f0bSApple OSS Distributions 	}
2500*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(86, mount);
2501*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_stat, cred, mount, mac_mount_label(mount));
2502*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(86, mount);
2503*d4514f0bSApple OSS Distributions 
2504*d4514f0bSApple OSS Distributions 	return error;
2505*d4514f0bSApple OSS Distributions }
2506*d4514f0bSApple OSS Distributions 
2507*d4514f0bSApple OSS Distributions int
mac_mount_check_label_update(vfs_context_t ctx,struct mount * mount)2508*d4514f0bSApple OSS Distributions mac_mount_check_label_update(vfs_context_t ctx, struct mount *mount)
2509*d4514f0bSApple OSS Distributions {
2510*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2511*d4514f0bSApple OSS Distributions 	int error;
2512*d4514f0bSApple OSS Distributions 
2513*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2514*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2515*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2516*d4514f0bSApple OSS Distributions 		return 0;
2517*d4514f0bSApple OSS Distributions 	}
2518*d4514f0bSApple OSS Distributions #endif
2519*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2520*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2521*d4514f0bSApple OSS Distributions 		return 0;
2522*d4514f0bSApple OSS Distributions 	}
2523*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(87, mount);
2524*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_label_update, cred, mount, mac_mount_label(mount));
2525*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(87, mount);
2526*d4514f0bSApple OSS Distributions 
2527*d4514f0bSApple OSS Distributions 	return error;
2528*d4514f0bSApple OSS Distributions }
2529*d4514f0bSApple OSS Distributions 
2530*d4514f0bSApple OSS Distributions int
mac_mount_check_fsctl(vfs_context_t ctx,struct mount * mp,u_long cmd)2531*d4514f0bSApple OSS Distributions mac_mount_check_fsctl(vfs_context_t ctx, struct mount *mp, u_long cmd)
2532*d4514f0bSApple OSS Distributions {
2533*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2534*d4514f0bSApple OSS Distributions 	int error;
2535*d4514f0bSApple OSS Distributions 
2536*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2537*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2538*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2539*d4514f0bSApple OSS Distributions 		return 0;
2540*d4514f0bSApple OSS Distributions 	}
2541*d4514f0bSApple OSS Distributions #endif
2542*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2543*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2544*d4514f0bSApple OSS Distributions 		return 0;
2545*d4514f0bSApple OSS Distributions 	}
2546*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(88, mp);
2547*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_fsctl, cred, mp, mac_mount_label(mp), cmd);
2548*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(88, mp);
2549*d4514f0bSApple OSS Distributions 
2550*d4514f0bSApple OSS Distributions 	return error;
2551*d4514f0bSApple OSS Distributions }
2552*d4514f0bSApple OSS Distributions 
2553*d4514f0bSApple OSS Distributions void
mac_devfs_label_associate_device(dev_t dev,struct devnode * de,const char * fullpath)2554*d4514f0bSApple OSS Distributions mac_devfs_label_associate_device(dev_t dev, struct devnode *de,
2555*d4514f0bSApple OSS Distributions     const char *fullpath)
2556*d4514f0bSApple OSS Distributions {
2557*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2558*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2559*d4514f0bSApple OSS Distributions 	if (!mac_device_enforce) {
2560*d4514f0bSApple OSS Distributions 		return;
2561*d4514f0bSApple OSS Distributions 	}
2562*d4514f0bSApple OSS Distributions #endif
2563*d4514f0bSApple OSS Distributions 
2564*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(89, de);
2565*d4514f0bSApple OSS Distributions 	MAC_PERFORM(devfs_label_associate_device, dev, de, mac_devfs_label(de),
2566*d4514f0bSApple OSS Distributions 	    fullpath);
2567*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(89, de);
2568*d4514f0bSApple OSS Distributions }
2569*d4514f0bSApple OSS Distributions 
2570*d4514f0bSApple OSS Distributions void
mac_devfs_label_associate_directory(const char * dirname,int dirnamelen,struct devnode * de,const char * fullpath)2571*d4514f0bSApple OSS Distributions mac_devfs_label_associate_directory(const char *dirname, int dirnamelen,
2572*d4514f0bSApple OSS Distributions     struct devnode *de, const char *fullpath)
2573*d4514f0bSApple OSS Distributions {
2574*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2575*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2576*d4514f0bSApple OSS Distributions 	if (!mac_device_enforce) {
2577*d4514f0bSApple OSS Distributions 		return;
2578*d4514f0bSApple OSS Distributions 	}
2579*d4514f0bSApple OSS Distributions #endif
2580*d4514f0bSApple OSS Distributions 
2581*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(90, de);
2582*d4514f0bSApple OSS Distributions 	MAC_PERFORM(devfs_label_associate_directory, dirname, dirnamelen, de,
2583*d4514f0bSApple OSS Distributions 	    mac_devfs_label(de), fullpath);
2584*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(90, de);
2585*d4514f0bSApple OSS Distributions }
2586*d4514f0bSApple OSS Distributions 
2587*d4514f0bSApple OSS Distributions int
vn_setlabel(struct vnode * vp,struct label * intlabel,vfs_context_t context)2588*d4514f0bSApple OSS Distributions vn_setlabel(struct vnode *vp, struct label *intlabel, vfs_context_t context)
2589*d4514f0bSApple OSS Distributions {
2590*d4514f0bSApple OSS Distributions 	int error;
2591*d4514f0bSApple OSS Distributions 
2592*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2593*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2594*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2595*d4514f0bSApple OSS Distributions 		return 0;
2596*d4514f0bSApple OSS Distributions 	}
2597*d4514f0bSApple OSS Distributions #endif
2598*d4514f0bSApple OSS Distributions 	if (!mac_label_vnodes) {
2599*d4514f0bSApple OSS Distributions 		return 0;
2600*d4514f0bSApple OSS Distributions 	}
2601*d4514f0bSApple OSS Distributions 
2602*d4514f0bSApple OSS Distributions 	if (vp->v_mount == NULL) {
2603*d4514f0bSApple OSS Distributions 		printf("vn_setlabel: null v_mount\n");
2604*d4514f0bSApple OSS Distributions 		if (vp->v_type != VNON) {
2605*d4514f0bSApple OSS Distributions 			printf("vn_setlabel: null v_mount with non-VNON\n");
2606*d4514f0bSApple OSS Distributions 		}
2607*d4514f0bSApple OSS Distributions 		return EBADF;
2608*d4514f0bSApple OSS Distributions 	}
2609*d4514f0bSApple OSS Distributions 
2610*d4514f0bSApple OSS Distributions 	if ((vp->v_mount->mnt_flag & MNT_MULTILABEL) == 0) {
2611*d4514f0bSApple OSS Distributions 		return ENOTSUP;
2612*d4514f0bSApple OSS Distributions 	}
2613*d4514f0bSApple OSS Distributions 
2614*d4514f0bSApple OSS Distributions 	/*
2615*d4514f0bSApple OSS Distributions 	 * Multi-phase commit.  First check the policies to confirm the
2616*d4514f0bSApple OSS Distributions 	 * change is OK.  Then commit via the filesystem.  Finally,
2617*d4514f0bSApple OSS Distributions 	 * update the actual vnode label.  Question: maybe the filesystem
2618*d4514f0bSApple OSS Distributions 	 * should update the vnode at the end as part of VNOP_SETLABEL()?
2619*d4514f0bSApple OSS Distributions 	 */
2620*d4514f0bSApple OSS Distributions 	error = mac_vnode_check_label_update(context, vp, intlabel);
2621*d4514f0bSApple OSS Distributions 	if (error) {
2622*d4514f0bSApple OSS Distributions 		return error;
2623*d4514f0bSApple OSS Distributions 	}
2624*d4514f0bSApple OSS Distributions 
2625*d4514f0bSApple OSS Distributions 	error = VNOP_SETLABEL(vp, intlabel, context);
2626*d4514f0bSApple OSS Distributions 	if (error == ENOTSUP) {
2627*d4514f0bSApple OSS Distributions 		error = mac_vnode_label_store(context, vp,
2628*d4514f0bSApple OSS Distributions 		    intlabel);
2629*d4514f0bSApple OSS Distributions 		if (error) {
2630*d4514f0bSApple OSS Distributions 			printf("%s: mac_vnode_label_store failed %d\n",
2631*d4514f0bSApple OSS Distributions 			    __func__, error);
2632*d4514f0bSApple OSS Distributions 			return error;
2633*d4514f0bSApple OSS Distributions 		}
2634*d4514f0bSApple OSS Distributions 		mac_vnode_label_update(context, vp, intlabel);
2635*d4514f0bSApple OSS Distributions 	} else if (error) {
2636*d4514f0bSApple OSS Distributions 		printf("vn_setlabel: vop setlabel failed %d\n", error);
2637*d4514f0bSApple OSS Distributions 		return error;
2638*d4514f0bSApple OSS Distributions 	}
2639*d4514f0bSApple OSS Distributions 
2640*d4514f0bSApple OSS Distributions 	return 0;
2641*d4514f0bSApple OSS Distributions }
2642*d4514f0bSApple OSS Distributions 
2643*d4514f0bSApple OSS Distributions int
mac_vnode_label_associate_fdesc(struct mount * mp,struct fdescnode * fnp,struct vnode * vp,vfs_context_t ctx)2644*d4514f0bSApple OSS Distributions mac_vnode_label_associate_fdesc(struct mount *mp, struct fdescnode *fnp,
2645*d4514f0bSApple OSS Distributions     struct vnode *vp, vfs_context_t ctx)
2646*d4514f0bSApple OSS Distributions {
2647*d4514f0bSApple OSS Distributions 	struct fileproc *fp;
2648*d4514f0bSApple OSS Distributions #if CONFIG_MACF_SOCKET_SUBSET
2649*d4514f0bSApple OSS Distributions 	struct socket *so;
2650*d4514f0bSApple OSS Distributions #endif
2651*d4514f0bSApple OSS Distributions 	struct pipe *cpipe;
2652*d4514f0bSApple OSS Distributions 	struct vnode *fvp;
2653*d4514f0bSApple OSS Distributions 	struct proc *p;
2654*d4514f0bSApple OSS Distributions 	int error;
2655*d4514f0bSApple OSS Distributions 
2656*d4514f0bSApple OSS Distributions 	error = 0;
2657*d4514f0bSApple OSS Distributions 
2658*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(91, vp);
2659*d4514f0bSApple OSS Distributions 	/*
2660*d4514f0bSApple OSS Distributions 	 * If no backing file, let the policy choose which label to use.
2661*d4514f0bSApple OSS Distributions 	 */
2662*d4514f0bSApple OSS Distributions 	if (fnp->fd_fd == -1) {
2663*d4514f0bSApple OSS Distributions 		MAC_PERFORM(vnode_label_associate_file, vfs_context_ucred(ctx),
2664*d4514f0bSApple OSS Distributions 		    mp, mac_mount_label(mp), NULL, NULL, vp, mac_vnode_label(vp));
2665*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(91, vp);
2666*d4514f0bSApple OSS Distributions 		return 0;
2667*d4514f0bSApple OSS Distributions 	}
2668*d4514f0bSApple OSS Distributions 
2669*d4514f0bSApple OSS Distributions 	p = vfs_context_proc(ctx);
2670*d4514f0bSApple OSS Distributions 	error = fp_lookup(p, fnp->fd_fd, &fp, 0);
2671*d4514f0bSApple OSS Distributions 	if (error) {
2672*d4514f0bSApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(91, vp);
2673*d4514f0bSApple OSS Distributions 		return error;
2674*d4514f0bSApple OSS Distributions 	}
2675*d4514f0bSApple OSS Distributions 
2676*d4514f0bSApple OSS Distributions 	if (fp->fp_glob == NULL) {
2677*d4514f0bSApple OSS Distributions 		error = EBADF;
2678*d4514f0bSApple OSS Distributions 		goto out;
2679*d4514f0bSApple OSS Distributions 	}
2680*d4514f0bSApple OSS Distributions 
2681*d4514f0bSApple OSS Distributions 	switch (FILEGLOB_DTYPE(fp->fp_glob)) {
2682*d4514f0bSApple OSS Distributions 	case DTYPE_VNODE:
2683*d4514f0bSApple OSS Distributions 		fvp = (struct vnode *)fp_get_data(fp);
2684*d4514f0bSApple OSS Distributions 		if ((error = vnode_getwithref(fvp))) {
2685*d4514f0bSApple OSS Distributions 			goto out;
2686*d4514f0bSApple OSS Distributions 		}
2687*d4514f0bSApple OSS Distributions 		if (mac_vnode_label(fvp) != NULL) {
2688*d4514f0bSApple OSS Distributions 			if (mac_label_vnodes != 0 && mac_vnode_label(vp) == NULL) {
2689*d4514f0bSApple OSS Distributions 				mac_vnode_label_init(vp); /* init dst label */
2690*d4514f0bSApple OSS Distributions 			}
2691*d4514f0bSApple OSS Distributions 			MAC_PERFORM(vnode_label_copy, mac_vnode_label(fvp), mac_vnode_label(vp));
2692*d4514f0bSApple OSS Distributions 		}
2693*d4514f0bSApple OSS Distributions 		(void)vnode_put(fvp);
2694*d4514f0bSApple OSS Distributions 		break;
2695*d4514f0bSApple OSS Distributions #if CONFIG_MACF_SOCKET_SUBSET
2696*d4514f0bSApple OSS Distributions 	case DTYPE_SOCKET:
2697*d4514f0bSApple OSS Distributions 		so = (struct socket *)fp_get_data(fp);
2698*d4514f0bSApple OSS Distributions 		socket_lock(so, 1);
2699*d4514f0bSApple OSS Distributions 		MAC_PERFORM(vnode_label_associate_socket,
2700*d4514f0bSApple OSS Distributions 		    vfs_context_ucred(ctx), (socket_t)so, NULL,
2701*d4514f0bSApple OSS Distributions 		    vp, mac_vnode_label(vp));
2702*d4514f0bSApple OSS Distributions 		socket_unlock(so, 1);
2703*d4514f0bSApple OSS Distributions 		break;
2704*d4514f0bSApple OSS Distributions #endif
2705*d4514f0bSApple OSS Distributions 	case DTYPE_PSXSHM:
2706*d4514f0bSApple OSS Distributions 		pshm_label_associate(fp, vp, ctx);
2707*d4514f0bSApple OSS Distributions 		break;
2708*d4514f0bSApple OSS Distributions 	case DTYPE_PSXSEM:
2709*d4514f0bSApple OSS Distributions 		psem_label_associate(fp, vp, ctx);
2710*d4514f0bSApple OSS Distributions 		break;
2711*d4514f0bSApple OSS Distributions 	case DTYPE_PIPE:
2712*d4514f0bSApple OSS Distributions 		cpipe = (struct pipe *)fp_get_data(fp);
2713*d4514f0bSApple OSS Distributions 		/* kern/sys_pipe.c:pipe_select() suggests this test. */
2714*d4514f0bSApple OSS Distributions 		if (cpipe == (struct pipe *)-1) {
2715*d4514f0bSApple OSS Distributions 			error = EINVAL;
2716*d4514f0bSApple OSS Distributions 			goto out;
2717*d4514f0bSApple OSS Distributions 		}
2718*d4514f0bSApple OSS Distributions 		PIPE_LOCK(cpipe);
2719*d4514f0bSApple OSS Distributions 		MAC_PERFORM(vnode_label_associate_pipe, vfs_context_ucred(ctx),
2720*d4514f0bSApple OSS Distributions 		    cpipe, mac_pipe_label(cpipe), vp, mac_vnode_label(vp));
2721*d4514f0bSApple OSS Distributions 		PIPE_UNLOCK(cpipe);
2722*d4514f0bSApple OSS Distributions 		break;
2723*d4514f0bSApple OSS Distributions 	case DTYPE_KQUEUE:
2724*d4514f0bSApple OSS Distributions 	case DTYPE_FSEVENTS:
2725*d4514f0bSApple OSS Distributions 	case DTYPE_ATALK:
2726*d4514f0bSApple OSS Distributions 	case DTYPE_NETPOLICY:
2727*d4514f0bSApple OSS Distributions 	case DTYPE_CHANNEL:
2728*d4514f0bSApple OSS Distributions 	case DTYPE_NEXUS:
2729*d4514f0bSApple OSS Distributions 	default:
2730*d4514f0bSApple OSS Distributions 		MAC_PERFORM(vnode_label_associate_file, vfs_context_ucred(ctx),
2731*d4514f0bSApple OSS Distributions 		    mp, mac_mount_label(mp), fp->fp_glob, NULL,
2732*d4514f0bSApple OSS Distributions 		    vp, mac_vnode_label(vp));
2733*d4514f0bSApple OSS Distributions 		break;
2734*d4514f0bSApple OSS Distributions 	}
2735*d4514f0bSApple OSS Distributions out:
2736*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(91, vp);
2737*d4514f0bSApple OSS Distributions 	fp_drop(p, fnp->fd_fd, fp, 0);
2738*d4514f0bSApple OSS Distributions 	return error;
2739*d4514f0bSApple OSS Distributions }
2740*d4514f0bSApple OSS Distributions 
2741*d4514f0bSApple OSS Distributions intptr_t
mac_vnode_label_get(struct vnode * vp,int slot,intptr_t sentinel)2742*d4514f0bSApple OSS Distributions mac_vnode_label_get(struct vnode *vp, int slot, intptr_t sentinel)
2743*d4514f0bSApple OSS Distributions {
2744*d4514f0bSApple OSS Distributions 	struct label *l;
2745*d4514f0bSApple OSS Distributions 
2746*d4514f0bSApple OSS Distributions 	KASSERT(vp != NULL, ("mac_vnode_label_get: NULL vnode"));
2747*d4514f0bSApple OSS Distributions 	l = mac_vnode_label(vp);
2748*d4514f0bSApple OSS Distributions 	if (l != NULL) {
2749*d4514f0bSApple OSS Distributions 		return mac_label_get(l, slot);
2750*d4514f0bSApple OSS Distributions 	} else {
2751*d4514f0bSApple OSS Distributions 		return sentinel;
2752*d4514f0bSApple OSS Distributions 	}
2753*d4514f0bSApple OSS Distributions }
2754*d4514f0bSApple OSS Distributions 
2755*d4514f0bSApple OSS Distributions void
mac_vnode_label_set(struct vnode * vp,int slot,intptr_t v)2756*d4514f0bSApple OSS Distributions mac_vnode_label_set(struct vnode *vp, int slot, intptr_t v)
2757*d4514f0bSApple OSS Distributions {
2758*d4514f0bSApple OSS Distributions 	struct label *l;
2759*d4514f0bSApple OSS Distributions 	KASSERT(vp != NULL, ("mac_vnode_label_set: NULL vnode"));
2760*d4514f0bSApple OSS Distributions 	l = mac_vnode_label(vp);
2761*d4514f0bSApple OSS Distributions 	if (l == NULL) {
2762*d4514f0bSApple OSS Distributions 		mac_vnode_label_init(vp);
2763*d4514f0bSApple OSS Distributions 		l = mac_vnode_label(vp);
2764*d4514f0bSApple OSS Distributions 	}
2765*d4514f0bSApple OSS Distributions 	mac_label_set(l, slot, v);
2766*d4514f0bSApple OSS Distributions }
2767*d4514f0bSApple OSS Distributions 
2768*d4514f0bSApple OSS Distributions void
mac_vnode_notify_reclaim(struct vnode * vp)2769*d4514f0bSApple OSS Distributions mac_vnode_notify_reclaim(struct vnode *vp)
2770*d4514f0bSApple OSS Distributions {
2771*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(94, vp);
2772*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_reclaim, vp);
2773*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(94, vp);
2774*d4514f0bSApple OSS Distributions }
2775*d4514f0bSApple OSS Distributions 
2776*d4514f0bSApple OSS Distributions int
mac_mount_check_quotactl(vfs_context_t ctx,struct mount * mp,int cmd,int id)2777*d4514f0bSApple OSS Distributions mac_mount_check_quotactl(vfs_context_t ctx, struct mount *mp, int cmd, int id)
2778*d4514f0bSApple OSS Distributions {
2779*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2780*d4514f0bSApple OSS Distributions 	int error;
2781*d4514f0bSApple OSS Distributions 
2782*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2783*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2784*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2785*d4514f0bSApple OSS Distributions 		return 0;
2786*d4514f0bSApple OSS Distributions 	}
2787*d4514f0bSApple OSS Distributions #endif
2788*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2789*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2790*d4514f0bSApple OSS Distributions 		return 0;
2791*d4514f0bSApple OSS Distributions 	}
2792*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(95, mp);
2793*d4514f0bSApple OSS Distributions 	MAC_CHECK(mount_check_quotactl, cred, mp, cmd, id);
2794*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(95, mp);
2795*d4514f0bSApple OSS Distributions 
2796*d4514f0bSApple OSS Distributions 	return error;
2797*d4514f0bSApple OSS Distributions }
2798*d4514f0bSApple OSS Distributions 
2799*d4514f0bSApple OSS Distributions int
mac_vnode_check_getattrlistbulk(vfs_context_t ctx,struct vnode * vp,struct attrlist * alist,uint64_t options)2800*d4514f0bSApple OSS Distributions mac_vnode_check_getattrlistbulk(vfs_context_t ctx, struct vnode *vp, struct attrlist *alist, uint64_t options)
2801*d4514f0bSApple OSS Distributions {
2802*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2803*d4514f0bSApple OSS Distributions 	int error;
2804*d4514f0bSApple OSS Distributions 
2805*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2806*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2807*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2808*d4514f0bSApple OSS Distributions 		return 0;
2809*d4514f0bSApple OSS Distributions 	}
2810*d4514f0bSApple OSS Distributions #endif
2811*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2812*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2813*d4514f0bSApple OSS Distributions 		return 0;
2814*d4514f0bSApple OSS Distributions 	}
2815*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(96, mp);
2816*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_getattrlistbulk, cred, vp, alist, options);
2817*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(96, mp);
2818*d4514f0bSApple OSS Distributions 
2819*d4514f0bSApple OSS Distributions 	return error;
2820*d4514f0bSApple OSS Distributions }
2821*d4514f0bSApple OSS Distributions 
2822*d4514f0bSApple OSS Distributions int
mac_vnode_check_copyfile(vfs_context_t ctx,struct vnode * dvp,struct vnode * tvp,struct vnode * fvp,struct componentname * cnp,mode_t mode,int flags)2823*d4514f0bSApple OSS Distributions mac_vnode_check_copyfile(vfs_context_t ctx, struct vnode *dvp,
2824*d4514f0bSApple OSS Distributions     struct vnode *tvp, struct vnode *fvp, struct componentname *cnp,
2825*d4514f0bSApple OSS Distributions     mode_t mode, int flags)
2826*d4514f0bSApple OSS Distributions {
2827*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2828*d4514f0bSApple OSS Distributions 	int error;
2829*d4514f0bSApple OSS Distributions 
2830*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2831*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2832*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2833*d4514f0bSApple OSS Distributions 		return 0;
2834*d4514f0bSApple OSS Distributions 	}
2835*d4514f0bSApple OSS Distributions #endif
2836*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2837*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2838*d4514f0bSApple OSS Distributions 		return 0;
2839*d4514f0bSApple OSS Distributions 	}
2840*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(97, dvp);
2841*d4514f0bSApple OSS Distributions 	MAC_CHECK(vnode_check_copyfile, cred, dvp, mac_vnode_label(dvp),
2842*d4514f0bSApple OSS Distributions 	    tvp, tvp ? mac_vnode_label(tvp) : NULL, fvp, mac_vnode_label(fvp), cnp, mode, flags);
2843*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(97, dvp);
2844*d4514f0bSApple OSS Distributions 	return error;
2845*d4514f0bSApple OSS Distributions }
2846*d4514f0bSApple OSS Distributions 
2847*d4514f0bSApple OSS Distributions void
mac_vnode_notify_unlink(vfs_context_t ctx,struct vnode * dvp,struct vnode * vp,struct componentname * cnp)2848*d4514f0bSApple OSS Distributions mac_vnode_notify_unlink(vfs_context_t ctx, struct vnode *dvp, struct vnode *vp,
2849*d4514f0bSApple OSS Distributions     struct componentname *cnp)
2850*d4514f0bSApple OSS Distributions {
2851*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2852*d4514f0bSApple OSS Distributions 
2853*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2854*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2855*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2856*d4514f0bSApple OSS Distributions 		return;
2857*d4514f0bSApple OSS Distributions 	}
2858*d4514f0bSApple OSS Distributions #endif
2859*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2860*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2861*d4514f0bSApple OSS Distributions 		return;
2862*d4514f0bSApple OSS Distributions 	}
2863*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(98, vp);
2864*d4514f0bSApple OSS Distributions 	MAC_PERFORM(vnode_notify_unlink, cred, dvp, mac_vnode_label(dvp), vp,
2865*d4514f0bSApple OSS Distributions 	    mac_vnode_label(vp), cnp);
2866*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(98, vp);
2867*d4514f0bSApple OSS Distributions }
2868*d4514f0bSApple OSS Distributions 
2869*d4514f0bSApple OSS Distributions void
mac_vnode_notify_rename_swap(vfs_context_t ctx,struct vnode * fdvp,struct vnode * fvp,struct componentname * fcnp,struct vnode * tdvp,struct vnode * tvp,struct componentname * tcnp)2870*d4514f0bSApple OSS Distributions mac_vnode_notify_rename_swap(vfs_context_t ctx, struct vnode *fdvp,
2871*d4514f0bSApple OSS Distributions     struct vnode *fvp, struct componentname *fcnp, struct vnode *tdvp,
2872*d4514f0bSApple OSS Distributions     struct vnode *tvp, struct componentname *tcnp)
2873*d4514f0bSApple OSS Distributions {
2874*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2875*d4514f0bSApple OSS Distributions 
2876*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2877*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2878*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2879*d4514f0bSApple OSS Distributions 		return;
2880*d4514f0bSApple OSS Distributions 	}
2881*d4514f0bSApple OSS Distributions #endif
2882*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2883*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2884*d4514f0bSApple OSS Distributions 		return;
2885*d4514f0bSApple OSS Distributions 	}
2886*d4514f0bSApple OSS Distributions 
2887*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(99, fvp);
2888*d4514f0bSApple OSS Distributions 	MAC_POLICY_ITERATE({
2889*d4514f0bSApple OSS Distributions 		/* BEGIN IGNORE CODESTYLE */
2890*d4514f0bSApple OSS Distributions 		if (mpc->mpc_ops->mpo_vnode_notify_swap != NULL) {
2891*d4514f0bSApple OSS Distributions 			MAC_PERFORM_CALL(vnode_notify_swap, mpc);
2892*d4514f0bSApple OSS Distributions 			mpc->mpc_ops->mpo_vnode_notify_swap(cred, fvp, mac_vnode_label(fvp), tvp, mac_vnode_label(tvp));
2893*d4514f0bSApple OSS Distributions 			MAC_PERFORM_RSLT(vnode_notify_swap, mpc);
2894*d4514f0bSApple OSS Distributions 		} else if (mpc->mpc_ops->mpo_vnode_notify_rename != NULL) {
2895*d4514f0bSApple OSS Distributions 			MAC_PERFORM_CALL(vnode_notify_swap_rename, mpc);
2896*d4514f0bSApple OSS Distributions 			/* Call notify_rename twice, one for each member of the swap. */
2897*d4514f0bSApple OSS Distributions 			mpc->mpc_ops->mpo_vnode_notify_rename(cred, fvp, mac_vnode_label(fvp), tdvp, mac_vnode_label(tdvp), tcnp);
2898*d4514f0bSApple OSS Distributions 			mpc->mpc_ops->mpo_vnode_notify_rename(cred, tvp, mac_vnode_label(tvp), fdvp, mac_vnode_label(fdvp), fcnp);
2899*d4514f0bSApple OSS Distributions 			MAC_PERFORM_RSLT(vnode_notify_swap_rename, mpc);
2900*d4514f0bSApple OSS Distributions 		}
2901*d4514f0bSApple OSS Distributions 		/* END IGNORE CODESTYLE */
2902*d4514f0bSApple OSS Distributions 	});
2903*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(99, fvp);
2904*d4514f0bSApple OSS Distributions }
2905*d4514f0bSApple OSS Distributions 
2906*d4514f0bSApple OSS Distributions int
mac_vnode_check_rename_swap(vfs_context_t ctx,struct vnode * fdvp,struct vnode * fvp,struct componentname * fcnp,struct vnode * tdvp,struct vnode * tvp,struct componentname * tcnp)2907*d4514f0bSApple OSS Distributions mac_vnode_check_rename_swap(vfs_context_t ctx, struct vnode *fdvp,
2908*d4514f0bSApple OSS Distributions     struct vnode *fvp, struct componentname *fcnp, struct vnode *tdvp,
2909*d4514f0bSApple OSS Distributions     struct vnode *tvp, struct componentname *tcnp)
2910*d4514f0bSApple OSS Distributions {
2911*d4514f0bSApple OSS Distributions 	kauth_cred_t cred;
2912*d4514f0bSApple OSS Distributions 	int error;
2913*d4514f0bSApple OSS Distributions 
2914*d4514f0bSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2915*d4514f0bSApple OSS Distributions 	/* 21167099 - only check if we allow write */
2916*d4514f0bSApple OSS Distributions 	if (!mac_vnode_enforce) {
2917*d4514f0bSApple OSS Distributions 		return 0;
2918*d4514f0bSApple OSS Distributions 	}
2919*d4514f0bSApple OSS Distributions #endif
2920*d4514f0bSApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2921*d4514f0bSApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2922*d4514f0bSApple OSS Distributions 		return 0;
2923*d4514f0bSApple OSS Distributions 	}
2924*d4514f0bSApple OSS Distributions 
2925*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(100, fvp);
2926*d4514f0bSApple OSS Distributions 	error = 0;
2927*d4514f0bSApple OSS Distributions 	MAC_POLICY_ITERATE({
2928*d4514f0bSApple OSS Distributions 		/* BEGIN IGNORE CODESTYLE */
2929*d4514f0bSApple OSS Distributions 		int __step_err;
2930*d4514f0bSApple OSS Distributions 		if (mpc->mpc_ops->mpo_vnode_check_swap != NULL) {
2931*d4514f0bSApple OSS Distributions 			MAC_CHECK_CALL(vnode_check_swap, mpc);
2932*d4514f0bSApple OSS Distributions 			__step_err = mpc->mpc_ops->mpo_vnode_check_swap(cred, fvp, mac_vnode_label(fvp), tvp, mac_vnode_label(tvp));
2933*d4514f0bSApple OSS Distributions 			MAC_CHECK_RSLT(vnode_check_swap, mpc);
2934*d4514f0bSApple OSS Distributions 			error = mac_error_select(__step_err, error);
2935*d4514f0bSApple OSS Distributions 		} else if (mpc->mpc_ops->mpo_vnode_check_rename != NULL) {
2936*d4514f0bSApple OSS Distributions 		        MAC_PERFORM_CALL(vnode_check_swap_rename, mpc);
2937*d4514f0bSApple OSS Distributions 			/* Call check_rename twice, one for each member of the swap. */
2938*d4514f0bSApple OSS Distributions 			__step_err = mpc->mpc_ops->mpo_vnode_check_rename(cred, fdvp, mac_vnode_label(fdvp), fvp, mac_vnode_label(fvp), fcnp,
2939*d4514f0bSApple OSS Distributions 			    tdvp, mac_vnode_label(tdvp), tvp, mac_vnode_label(tvp), tcnp);
2940*d4514f0bSApple OSS Distributions 			error = mac_error_select(__step_err, error);
2941*d4514f0bSApple OSS Distributions 			__step_err = mpc->mpc_ops->mpo_vnode_check_rename(cred, tdvp, mac_vnode_label(tdvp), tvp, mac_vnode_label(tvp), tcnp,
2942*d4514f0bSApple OSS Distributions 			    fdvp, mac_vnode_label(fdvp), fvp, mac_vnode_label(fvp), fcnp);
2943*d4514f0bSApple OSS Distributions 			error = mac_error_select(__step_err, error);
2944*d4514f0bSApple OSS Distributions 			MAC_PERFORM_RSLT(vnode_check_swap_rename, mpc);
2945*d4514f0bSApple OSS Distributions 		}
2946*d4514f0bSApple OSS Distributions 		/* END IGNORE CODESTYLE */
2947*d4514f0bSApple OSS Distributions 	});
2948*d4514f0bSApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(100, fvp);
2949*d4514f0bSApple OSS Distributions 	return error;
2950*d4514f0bSApple OSS Distributions }
2951