1100894Srwatson/*-
2189503Srwatson * Copyright (c) 1999-2002, 2009 Robert N. M. Watson
3100894Srwatson * Copyright (c) 2001 Ilmar S. Habibulin
4141050Srwatson * Copyright (c) 2001-2005 McAfee, Inc.
5168954Srwatson * Copyright (c) 2005-2006 SPARTA, Inc.
6182063Srwatson * Copyright (c) 2008 Apple Inc.
7100894Srwatson * All rights reserved.
8100894Srwatson *
9100894Srwatson * This software was developed by Robert Watson and Ilmar Habibulin for the
10100894Srwatson * TrustedBSD Project.
11100894Srwatson *
12141050Srwatson * This software was developed for the FreeBSD Project in part by McAfee
13141050Srwatson * Research, the Security Research Division of McAfee, Inc. under
14141050Srwatson * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
15141050Srwatson * CHATS research program.
16100894Srwatson *
17165428Srwatson * This software was enhanced by SPARTA ISSO under SPAWAR contract
18147982Srwatson * N66001-04-C-6019 ("SEFOS").
19147982Srwatson *
20189503Srwatson * This software was developed at the University of Cambridge Computer
21189503Srwatson * Laboratory with support from a grant from Google, Inc.
22189503Srwatson *
23100894Srwatson * Redistribution and use in source and binary forms, with or without
24100894Srwatson * modification, are permitted provided that the following conditions
25100894Srwatson * are met:
26100894Srwatson * 1. Redistributions of source code must retain the above copyright
27100894Srwatson *    notice, this list of conditions and the following disclaimer.
28100894Srwatson * 2. Redistributions in binary form must reproduce the above copyright
29100894Srwatson *    notice, this list of conditions and the following disclaimer in the
30100894Srwatson *    documentation and/or other materials provided with the distribution.
31100894Srwatson *
32100894Srwatson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
33100894Srwatson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
34100894Srwatson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
35100894Srwatson * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
36100894Srwatson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37100894Srwatson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38100894Srwatson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39100894Srwatson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
40100894Srwatson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
41100894Srwatson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
42100894Srwatson * SUCH DAMAGE.
43100894Srwatson */
44116182Sobrien
45116182Sobrien#include <sys/cdefs.h>
46116182Sobrien__FBSDID("$FreeBSD$");
47116182Sobrien
48189503Srwatson#include "opt_kdtrace.h"
49100894Srwatson#include "opt_mac.h"
50101173Srwatson
51100894Srwatson#include <sys/param.h>
52106856Srwatson#include <sys/condvar.h>
53100979Srwatson#include <sys/extattr.h>
54106468Srwatson#include <sys/imgact.h>
55100979Srwatson#include <sys/kernel.h>
56100979Srwatson#include <sys/lock.h>
57102949Sbde#include <sys/malloc.h>
58100979Srwatson#include <sys/mutex.h>
59100979Srwatson#include <sys/proc.h>
60116701Srwatson#include <sys/sbuf.h>
61100979Srwatson#include <sys/systm.h>
62100979Srwatson#include <sys/vnode.h>
63100979Srwatson#include <sys/mount.h>
64100979Srwatson#include <sys/file.h>
65100979Srwatson#include <sys/namei.h>
66189503Srwatson#include <sys/sdt.h>
67100979Srwatson#include <sys/sysctl.h>
68100894Srwatson
69100979Srwatson#include <vm/vm.h>
70100979Srwatson#include <vm/pmap.h>
71100979Srwatson#include <vm/vm_map.h>
72100979Srwatson#include <vm/vm_object.h>
73100979Srwatson
74100979Srwatson#include <fs/devfs/devfs.h>
75100979Srwatson
76163606Srwatson#include <security/mac/mac_framework.h>
77121367Srwatson#include <security/mac/mac_internal.h>
78165469Srwatson#include <security/mac/mac_policy.h>
79100979Srwatson
80101712Srwatson/*
81165428Srwatson * Warn about EA transactions only the first time they happen.  No locking on
82165428Srwatson * this variable.
83105988Srwatson */
84105988Srwatsonstatic int	ea_warn_once = 0;
85105988Srwatson
86172930Srwatsonstatic int	mac_vnode_setlabel_extattr(struct ucred *cred,
87105988Srwatson		    struct vnode *vp, struct label *intlabel);
88105988Srwatson
89122524Srwatsonstatic struct label *
90168977Srwatsonmac_devfs_label_alloc(void)
91104521Srwatson{
92122524Srwatson	struct label *label;
93104521Srwatson
94122524Srwatson	label = mac_labelzone_alloc(M_WAITOK);
95191731Srwatson	MAC_POLICY_PERFORM(devfs_init_label, label);
96122524Srwatson	return (label);
97104521Srwatson}
98104521Srwatson
99104521Srwatsonvoid
100172930Srwatsonmac_devfs_init(struct devfs_dirent *de)
101104521Srwatson{
102104521Srwatson
103182063Srwatson	if (mac_labeled & MPC_OBJECT_DEVFS)
104182063Srwatson		de->de_label = mac_devfs_label_alloc();
105182063Srwatson	else
106182063Srwatson		de->de_label = NULL;
107122524Srwatson}
108122524Srwatson
109122524Srwatsonstatic struct label *
110122524Srwatsonmac_mount_label_alloc(void)
111122524Srwatson{
112122524Srwatson	struct label *label;
113122524Srwatson
114122524Srwatson	label = mac_labelzone_alloc(M_WAITOK);
115191731Srwatson	MAC_POLICY_PERFORM(mount_init_label, label);
116122524Srwatson	return (label);
117104521Srwatson}
118104521Srwatson
119104521Srwatsonvoid
120172930Srwatsonmac_mount_init(struct mount *mp)
121104521Srwatson{
122104521Srwatson
123182063Srwatson	if (mac_labeled & MPC_OBJECT_MOUNT)
124182063Srwatson		mp->mnt_label = mac_mount_label_alloc();
125182063Srwatson	else
126182063Srwatson		mp->mnt_label = NULL;
127122524Srwatson}
128122524Srwatson
129122524Srwatsonstruct label *
130122524Srwatsonmac_vnode_label_alloc(void)
131122524Srwatson{
132122524Srwatson	struct label *label;
133122524Srwatson
134122524Srwatson	label = mac_labelzone_alloc(M_WAITOK);
135191731Srwatson	MAC_POLICY_PERFORM(vnode_init_label, label);
136122524Srwatson	return (label);
137104521Srwatson}
138104521Srwatson
139104521Srwatsonvoid
140172930Srwatsonmac_vnode_init(struct vnode *vp)
141104521Srwatson{
142104521Srwatson
143182063Srwatson	if (mac_labeled & MPC_OBJECT_VNODE)
144182063Srwatson		vp->v_label = mac_vnode_label_alloc();
145182063Srwatson	else
146182063Srwatson		vp->v_label = NULL;
147104521Srwatson}
148104521Srwatson
149122524Srwatsonstatic void
150168977Srwatsonmac_devfs_label_free(struct label *label)
151122524Srwatson{
152122524Srwatson
153191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(devfs_destroy_label, label);
154122524Srwatson	mac_labelzone_free(label);
155122524Srwatson}
156122524Srwatson
157104521Srwatsonvoid
158172930Srwatsonmac_devfs_destroy(struct devfs_dirent *de)
159104521Srwatson{
160104521Srwatson
161182063Srwatson	if (de->de_label != NULL) {
162182063Srwatson		mac_devfs_label_free(de->de_label);
163182063Srwatson		de->de_label = NULL;
164182063Srwatson	}
165104521Srwatson}
166104521Srwatson
167122524Srwatsonstatic void
168122524Srwatsonmac_mount_label_free(struct label *label)
169122524Srwatson{
170122524Srwatson
171191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(mount_destroy_label, label);
172122524Srwatson	mac_labelzone_free(label);
173122524Srwatson}
174122524Srwatson
175104521Srwatsonvoid
176172930Srwatsonmac_mount_destroy(struct mount *mp)
177104521Srwatson{
178104521Srwatson
179182063Srwatson	if (mp->mnt_label != NULL) {
180182063Srwatson		mac_mount_label_free(mp->mnt_label);
181182063Srwatson		mp->mnt_label = NULL;
182182063Srwatson	}
183104521Srwatson}
184104521Srwatson
185105694Srwatsonvoid
186122524Srwatsonmac_vnode_label_free(struct label *label)
187104521Srwatson{
188104521Srwatson
189191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(vnode_destroy_label, label);
190122524Srwatson	mac_labelzone_free(label);
191104521Srwatson}
192104521Srwatson
193104521Srwatsonvoid
194172930Srwatsonmac_vnode_destroy(struct vnode *vp)
195104521Srwatson{
196104521Srwatson
197182063Srwatson	if (vp->v_label != NULL) {
198182063Srwatson		mac_vnode_label_free(vp->v_label);
199182063Srwatson		vp->v_label = NULL;
200182063Srwatson	}
201104521Srwatson}
202104521Srwatson
203113487Srwatsonvoid
204172930Srwatsonmac_vnode_copy_label(struct label *src, struct label *dest)
205105694Srwatson{
206105694Srwatson
207191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(vnode_copy_label, src, dest);
208105694Srwatson}
209105694Srwatson
210121367Srwatsonint
211172930Srwatsonmac_vnode_externalize_label(struct label *label, char *elements,
212122159Srwatson    char *outbuf, size_t outbuflen)
213105694Srwatson{
214105694Srwatson	int error;
215105694Srwatson
216191731Srwatson	MAC_POLICY_EXTERNALIZE(vnode, label, elements, outbuf, outbuflen);
217105694Srwatson
218105694Srwatson	return (error);
219105694Srwatson}
220105694Srwatson
221121367Srwatsonint
222172930Srwatsonmac_vnode_internalize_label(struct label *label, char *string)
223105694Srwatson{
224105694Srwatson	int error;
225105694Srwatson
226191731Srwatson	MAC_POLICY_INTERNALIZE(vnode, label, string);
227105694Srwatson
228105694Srwatson	return (error);
229105694Srwatson}
230105694Srwatson
231104521Srwatsonvoid
232172930Srwatsonmac_devfs_update(struct mount *mp, struct devfs_dirent *de, struct vnode *vp)
233100979Srwatson{
234100979Srwatson
235191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(devfs_update, mp, de, de->de_label, vp,
236189797Srwatson	    vp->v_label);
237100979Srwatson}
238100979Srwatson
239100979Srwatsonvoid
240172930Srwatsonmac_devfs_vnode_associate(struct mount *mp, struct devfs_dirent *de,
241105988Srwatson    struct vnode *vp)
242100979Srwatson{
243100979Srwatson
244191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(devfs_vnode_associate, mp, mp->mnt_label,
245191731Srwatson	    de, de->de_label, vp, vp->v_label);
246100979Srwatson}
247100979Srwatson
248105988Srwatsonint
249172930Srwatsonmac_vnode_associate_extattr(struct mount *mp, struct vnode *vp)
250100979Srwatson{
251100979Srwatson	int error;
252100979Srwatson
253172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_associate_extattr");
254100979Srwatson
255191731Srwatson	MAC_POLICY_CHECK(vnode_associate_extattr, mp, mp->mnt_label, vp,
256122524Srwatson	    vp->v_label);
257100979Srwatson
258100979Srwatson	return (error);
259100979Srwatson}
260100979Srwatson
261100979Srwatsonvoid
262172930Srwatsonmac_vnode_associate_singlelabel(struct mount *mp, struct vnode *vp)
263100979Srwatson{
264100979Srwatson
265191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(vnode_associate_singlelabel, mp,
266191731Srwatson	    mp->mnt_label, vp, vp->v_label);
267100979Srwatson}
268100979Srwatson
269165601Srwatson/*
270165601Srwatson * Functions implementing extended-attribute backed labels for file systems
271165601Srwatson * that support it.
272165601Srwatson *
273165601Srwatson * Where possible, we use EA transactions to make writes to multiple
274165601Srwatson * attributes across difference policies mutually atomic.  We allow work to
275165601Srwatson * continue on file systems not supporting EA transactions, but generate a
276165601Srwatson * printf warning.
277165601Srwatson */
278100979Srwatsonint
279172930Srwatsonmac_vnode_create_extattr(struct ucred *cred, struct mount *mp,
280105988Srwatson    struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
281100979Srwatson{
282105988Srwatson	int error;
283100979Srwatson
284172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_create_extattr");
285172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_create_extattr");
286100979Srwatson
287105988Srwatson	error = VOP_OPENEXTATTR(vp, cred, curthread);
288105988Srwatson	if (error == EOPNOTSUPP) {
289105988Srwatson		if (ea_warn_once == 0) {
290105988Srwatson			printf("Warning: transactions not supported "
291105988Srwatson			    "in EA write.\n");
292105988Srwatson			ea_warn_once = 1;
293105988Srwatson		}
294105988Srwatson	} else if (error)
295100979Srwatson		return (error);
296100979Srwatson
297191731Srwatson	MAC_POLICY_CHECK(vnode_create_extattr, cred, mp, mp->mnt_label, dvp,
298168954Srwatson	    dvp->v_label, vp, vp->v_label, cnp);
299100979Srwatson
300105988Srwatson	if (error) {
301105988Srwatson		VOP_CLOSEEXTATTR(vp, 0, NOCRED, curthread);
302100979Srwatson		return (error);
303100979Srwatson	}
304100979Srwatson
305105988Srwatson	error = VOP_CLOSEEXTATTR(vp, 1, NOCRED, curthread);
306105988Srwatson	if (error == EOPNOTSUPP)
307165601Srwatson		error = 0;
308100979Srwatson
309100979Srwatson	return (error);
310100979Srwatson}
311100979Srwatson
312100979Srwatsonstatic int
313172930Srwatsonmac_vnode_setlabel_extattr(struct ucred *cred, struct vnode *vp,
314105988Srwatson    struct label *intlabel)
315100979Srwatson{
316100979Srwatson	int error;
317100979Srwatson
318172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_setlabel_extattr");
319100979Srwatson
320105988Srwatson	error = VOP_OPENEXTATTR(vp, cred, curthread);
321105988Srwatson	if (error == EOPNOTSUPP) {
322105988Srwatson		if (ea_warn_once == 0) {
323105988Srwatson			printf("Warning: transactions not supported "
324105988Srwatson			    "in EA write.\n");
325105988Srwatson			ea_warn_once = 1;
326105988Srwatson		}
327105988Srwatson	} else if (error)
328105988Srwatson		return (error);
329100979Srwatson
330191731Srwatson	MAC_POLICY_CHECK(vnode_setlabel_extattr, cred, vp, vp->v_label,
331191731Srwatson	    intlabel);
332100979Srwatson
333105988Srwatson	if (error) {
334105988Srwatson		VOP_CLOSEEXTATTR(vp, 0, NOCRED, curthread);
335100979Srwatson		return (error);
336100979Srwatson	}
337100979Srwatson
338105988Srwatson	error = VOP_CLOSEEXTATTR(vp, 1, NOCRED, curthread);
339105988Srwatson	if (error == EOPNOTSUPP)
340165601Srwatson		error = 0;
341100979Srwatson
342105988Srwatson	return (error);
343100979Srwatson}
344100979Srwatson
345100979Srwatsonvoid
346172930Srwatsonmac_vnode_execve_transition(struct ucred *old, struct ucred *new,
347172953Srwatson    struct vnode *vp, struct label *interpvplabel, struct image_params *imgp)
348106468Srwatson{
349106468Srwatson
350172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_execve_transition");
351100979Srwatson
352191731Srwatson	MAC_POLICY_PERFORM(vnode_execve_transition, old, new, vp,
353191731Srwatson	    vp->v_label, interpvplabel, imgp, imgp->execlabel);
354100979Srwatson}
355100979Srwatson
356100979Srwatsonint
357172930Srwatsonmac_vnode_execve_will_transition(struct ucred *old, struct vnode *vp,
358172953Srwatson    struct label *interpvplabel, struct image_params *imgp)
359100979Srwatson{
360105988Srwatson	int result;
361100979Srwatson
362172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_execve_will_transition");
363106460Srwatson
364100979Srwatson	result = 0;
365189797Srwatson	/* No sleeping since the process lock will be held by the caller. */
366191731Srwatson	MAC_POLICY_BOOLEAN_NOSLEEP(vnode_execve_will_transition, ||, old, vp,
367189797Srwatson	    vp->v_label, interpvplabel, imgp, imgp->execlabel);
368100979Srwatson
369100979Srwatson	return (result);
370100979Srwatson}
371100979Srwatson
372189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_access, "struct ucred *",
373189503Srwatson    "struct vnode *", "accmode_t");
374189503Srwatson
375100979Srwatsonint
376184413Straszmac_vnode_check_access(struct ucred *cred, struct vnode *vp, accmode_t accmode)
377100979Srwatson{
378100979Srwatson	int error;
379100979Srwatson
380172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_access");
381100979Srwatson
382191731Srwatson	MAC_POLICY_CHECK(vnode_check_access, cred, vp, vp->v_label, accmode);
383189503Srwatson	MAC_CHECK_PROBE3(vnode_check_access, error, cred, vp, accmode);
384189503Srwatson
385100979Srwatson	return (error);
386100979Srwatson}
387100979Srwatson
388189503SrwatsonMAC_CHECK_PROBE_DEFINE2(vnode_check_chdir, "struct ucred *",
389189503Srwatson    "struct vnode *");
390189503Srwatson
391100979Srwatsonint
392172930Srwatsonmac_vnode_check_chdir(struct ucred *cred, struct vnode *dvp)
393100979Srwatson{
394100979Srwatson	int error;
395100979Srwatson
396172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_check_chdir");
397100979Srwatson
398191731Srwatson	MAC_POLICY_CHECK(vnode_check_chdir, cred, dvp, dvp->v_label);
399189503Srwatson	MAC_CHECK_PROBE2(vnode_check_chdir, error, cred, dvp);
400189503Srwatson
401100979Srwatson	return (error);
402100979Srwatson}
403100979Srwatson
404189503SrwatsonMAC_CHECK_PROBE_DEFINE2(vnode_check_chroot, "struct ucred *",
405189503Srwatson    "struct vnode *");
406189503Srwatson
407100979Srwatsonint
408172930Srwatsonmac_vnode_check_chroot(struct ucred *cred, struct vnode *dvp)
409100979Srwatson{
410100979Srwatson	int error;
411100979Srwatson
412172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_check_chroot");
413100979Srwatson
414191731Srwatson	MAC_POLICY_CHECK(vnode_check_chroot, cred, dvp, dvp->v_label);
415189503Srwatson	MAC_CHECK_PROBE2(vnode_check_chroot, error, cred, dvp);
416189503Srwatson
417100979Srwatson	return (error);
418100979Srwatson}
419100979Srwatson
420189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_create, "struct ucred *",
421189503Srwatson    "struct vnode *", "struct componentname *", "struct vattr *");
422189503Srwatson
423100979Srwatsonint
424172930Srwatsonmac_vnode_check_create(struct ucred *cred, struct vnode *dvp,
425100979Srwatson    struct componentname *cnp, struct vattr *vap)
426100979Srwatson{
427100979Srwatson	int error;
428100979Srwatson
429172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_check_create");
430100979Srwatson
431191731Srwatson	MAC_POLICY_CHECK(vnode_check_create, cred, dvp, dvp->v_label, cnp,
432191731Srwatson	    vap);
433189503Srwatson	MAC_CHECK_PROBE4(vnode_check_create, error, cred, dvp, cnp, vap);
434189503Srwatson
435100979Srwatson	return (error);
436100979Srwatson}
437100979Srwatson
438189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_deleteacl, "struct ucred *",
439189503Srwatson    "struct vnode *", "acl_type_t");
440189503Srwatson
441100979Srwatsonint
442172930Srwatsonmac_vnode_check_deleteacl(struct ucred *cred, struct vnode *vp,
443100979Srwatson    acl_type_t type)
444100979Srwatson{
445100979Srwatson	int error;
446100979Srwatson
447172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_deleteacl");
448100979Srwatson
449191731Srwatson	MAC_POLICY_CHECK(vnode_check_deleteacl, cred, vp, vp->v_label, type);
450189503Srwatson	MAC_CHECK_PROBE3(vnode_check_deleteacl, error, cred, vp, type);
451189503Srwatson
452100979Srwatson	return (error);
453100979Srwatson}
454100979Srwatson
455189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_deleteextattr, "struct ucred *",
456189503Srwatson    "struct vnode *", "int", "const char *");
457189503Srwatson
458100979Srwatsonint
459172930Srwatsonmac_vnode_check_deleteextattr(struct ucred *cred, struct vnode *vp,
460119198Srwatson    int attrnamespace, const char *name)
461119198Srwatson{
462119198Srwatson	int error;
463119198Srwatson
464172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_deleteextattr");
465119198Srwatson
466191731Srwatson	MAC_POLICY_CHECK(vnode_check_deleteextattr, cred, vp, vp->v_label,
467119198Srwatson	    attrnamespace, name);
468189503Srwatson	MAC_CHECK_PROBE4(vnode_check_deleteextattr, error, cred, vp,
469189503Srwatson	    attrnamespace, name);
470189503Srwatson
471119198Srwatson	return (error);
472119198Srwatson}
473119198Srwatson
474189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_exec, "struct ucred *", "struct vnode *",
475189503Srwatson    "struct image_params *");
476189503Srwatson
477119198Srwatsonint
478172930Srwatsonmac_vnode_check_exec(struct ucred *cred, struct vnode *vp,
479106468Srwatson    struct image_params *imgp)
480100979Srwatson{
481100979Srwatson	int error;
482100979Srwatson
483172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_exec");
484102102Srwatson
485191731Srwatson	MAC_POLICY_CHECK(vnode_check_exec, cred, vp, vp->v_label, imgp,
486106647Srwatson	    imgp->execlabel);
487189503Srwatson	MAC_CHECK_PROBE3(vnode_check_exec, error, cred, vp, imgp);
488100979Srwatson
489100979Srwatson	return (error);
490100979Srwatson}
491100979Srwatson
492189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_getacl, "struct ucred *",
493189503Srwatson    "struct vnode *", "acl_type_t");
494189503Srwatson
495100979Srwatsonint
496172930Srwatsonmac_vnode_check_getacl(struct ucred *cred, struct vnode *vp, acl_type_t type)
497100979Srwatson{
498100979Srwatson	int error;
499100979Srwatson
500172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_getacl");
501100979Srwatson
502191731Srwatson	MAC_POLICY_CHECK(vnode_check_getacl, cred, vp, vp->v_label, type);
503189503Srwatson	MAC_CHECK_PROBE3(vnode_check_getacl, error, cred, vp, type);
504189503Srwatson
505100979Srwatson	return (error);
506100979Srwatson}
507100979Srwatson
508189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_getextattr, "struct ucred *",
509189503Srwatson    "struct vnode *", "int", "const char *");
510189503Srwatson
511100979Srwatsonint
512172930Srwatsonmac_vnode_check_getextattr(struct ucred *cred, struct vnode *vp,
513189533Srwatson    int attrnamespace, const char *name)
514100979Srwatson{
515100979Srwatson	int error;
516100979Srwatson
517172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_getextattr");
518100979Srwatson
519191731Srwatson	MAC_POLICY_CHECK(vnode_check_getextattr, cred, vp, vp->v_label,
520189533Srwatson	    attrnamespace, name);
521189503Srwatson	MAC_CHECK_PROBE4(vnode_check_getextattr, error, cred, vp,
522189503Srwatson	    attrnamespace, name);
523189503Srwatson
524100979Srwatson	return (error);
525100979Srwatson}
526100979Srwatson
527189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_link, "struct ucred *", "struct vnode *",
528189503Srwatson    "struct vnode *", "struct componentname *");
529189503Srwatson
530100979Srwatsonint
531172930Srwatsonmac_vnode_check_link(struct ucred *cred, struct vnode *dvp,
532104529Srwatson    struct vnode *vp, struct componentname *cnp)
533104529Srwatson{
534104529Srwatson	int error;
535104529Srwatson
536172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_check_link");
537172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_link");
538104529Srwatson
539191731Srwatson	MAC_POLICY_CHECK(vnode_check_link, cred, dvp, dvp->v_label, vp,
540122524Srwatson	    vp->v_label, cnp);
541189503Srwatson	MAC_CHECK_PROBE4(vnode_check_link, error, cred, dvp, vp, cnp);
542189503Srwatson
543104529Srwatson	return (error);
544104529Srwatson}
545104529Srwatson
546189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_listextattr, "struct ucred *",
547189503Srwatson    "struct vnode *", "int");
548189503Srwatson
549104529Srwatsonint
550172930Srwatsonmac_vnode_check_listextattr(struct ucred *cred, struct vnode *vp,
551119198Srwatson    int attrnamespace)
552119198Srwatson{
553119198Srwatson	int error;
554119198Srwatson
555172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_listextattr");
556119198Srwatson
557191731Srwatson	MAC_POLICY_CHECK(vnode_check_listextattr, cred, vp, vp->v_label,
558119198Srwatson	    attrnamespace);
559189503Srwatson	MAC_CHECK_PROBE3(vnode_check_listextattr, error, cred, vp,
560189503Srwatson	    attrnamespace);
561189503Srwatson
562119198Srwatson	return (error);
563119198Srwatson}
564119198Srwatson
565189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_lookup, "struct ucred *",
566189503Srwatson    "struct vnode *", "struct componentname *");
567189503Srwatson
568119198Srwatsonint
569172930Srwatsonmac_vnode_check_lookup(struct ucred *cred, struct vnode *dvp,
570100979Srwatson    struct componentname *cnp)
571100979Srwatson{
572100979Srwatson	int error;
573100979Srwatson
574172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_check_lookup");
575100979Srwatson
576191731Srwatson	MAC_POLICY_CHECK(vnode_check_lookup, cred, dvp, dvp->v_label, cnp);
577189503Srwatson	MAC_CHECK_PROBE3(vnode_check_lookup, error, cred, dvp, cnp);
578189503Srwatson
579100979Srwatson	return (error);
580100979Srwatson}
581100979Srwatson
582189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_mmap, "struct ucred *", "struct vnode *",
583189503Srwatson    "int", "int");
584189503Srwatson
585104546Srwatsonint
586172953Srwatsonmac_vnode_check_mmap(struct ucred *cred, struct vnode *vp, int prot,
587172953Srwatson    int flags)
588100979Srwatson{
589104546Srwatson	int error;
590100979Srwatson
591172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_mmap");
592103514Srwatson
593191731Srwatson	MAC_POLICY_CHECK(vnode_check_mmap, cred, vp, vp->v_label, prot, flags);
594189503Srwatson	MAC_CHECK_PROBE4(vnode_check_mmap, error, cred, vp, prot, flags);
595189503Srwatson
596104546Srwatson	return (error);
597100979Srwatson}
598100979Srwatson
599104546Srwatsonvoid
600172953Srwatsonmac_vnode_check_mmap_downgrade(struct ucred *cred, struct vnode *vp,
601172953Srwatson    int *prot)
602104546Srwatson{
603104546Srwatson	int result = *prot;
604104546Srwatson
605172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_mmap_downgrade");
606104546Srwatson
607191731Srwatson	MAC_POLICY_PERFORM(vnode_check_mmap_downgrade, cred, vp, vp->v_label,
608104546Srwatson	    &result);
609104546Srwatson
610104546Srwatson	*prot = result;
611104546Srwatson}
612104546Srwatson
613189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_mprotect, "struct ucred *",
614189503Srwatson    "struct vnode *", "int");
615189503Srwatson
616100979Srwatsonint
617172930Srwatsonmac_vnode_check_mprotect(struct ucred *cred, struct vnode *vp, int prot)
618104546Srwatson{
619104546Srwatson	int error;
620104546Srwatson
621172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_mprotect");
622104546Srwatson
623191731Srwatson	MAC_POLICY_CHECK(vnode_check_mprotect, cred, vp, vp->v_label, prot);
624189503Srwatson	MAC_CHECK_PROBE3(vnode_check_mprotect, error, cred, vp, prot);
625189503Srwatson
626104546Srwatson	return (error);
627104546Srwatson}
628104546Srwatson
629189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_open, "struct ucred *", "struct vnode *",
630189503Srwatson    "accmode_t");
631189503Srwatson
632104546Srwatsonint
633184413Straszmac_vnode_check_open(struct ucred *cred, struct vnode *vp, accmode_t accmode)
634100979Srwatson{
635100979Srwatson	int error;
636100979Srwatson
637172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_open");
638102112Srwatson
639191731Srwatson	MAC_POLICY_CHECK(vnode_check_open, cred, vp, vp->v_label, accmode);
640214249Srwatson	MAC_CHECK_PROBE3(vnode_check_open, error, cred, vp, accmode);
641214249Srwatson
642102112Srwatson	return (error);
643102112Srwatson}
644102112Srwatson
645189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_poll, "struct ucred *", "struct ucred *",
646189503Srwatson    "struct vnode *");
647189503Srwatson
648102112Srwatsonint
649172930Srwatsonmac_vnode_check_poll(struct ucred *active_cred, struct ucred *file_cred,
650102129Srwatson    struct vnode *vp)
651102112Srwatson{
652102112Srwatson	int error;
653102112Srwatson
654172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_poll");
655102112Srwatson
656191731Srwatson	MAC_POLICY_CHECK(vnode_check_poll, active_cred, file_cred, vp,
657122524Srwatson	    vp->v_label);
658189503Srwatson	MAC_CHECK_PROBE3(vnode_check_poll, error, active_cred, file_cred,
659189503Srwatson	    vp);
660100979Srwatson
661100979Srwatson	return (error);
662100979Srwatson}
663100979Srwatson
664189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_read, "struct ucred *", "struct ucred *",
665189503Srwatson    "struct vnode *");
666189503Srwatson
667100979Srwatsonint
668172930Srwatsonmac_vnode_check_read(struct ucred *active_cred, struct ucred *file_cred,
669102129Srwatson    struct vnode *vp)
670100979Srwatson{
671100979Srwatson	int error;
672100979Srwatson
673172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_read");
674100979Srwatson
675191731Srwatson	MAC_POLICY_CHECK(vnode_check_read, active_cred, file_cred, vp,
676122524Srwatson	    vp->v_label);
677189503Srwatson	MAC_CHECK_PROBE3(vnode_check_read, error, active_cred, file_cred,
678189503Srwatson	    vp);
679102112Srwatson
680100979Srwatson	return (error);
681100979Srwatson}
682100979Srwatson
683189503SrwatsonMAC_CHECK_PROBE_DEFINE2(vnode_check_readdir, "struct ucred *",
684189503Srwatson    "struct vnode *");
685189503Srwatson
686100979Srwatsonint
687172930Srwatsonmac_vnode_check_readdir(struct ucred *cred, struct vnode *dvp)
688100979Srwatson{
689100979Srwatson	int error;
690100979Srwatson
691172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_check_readdir");
692100979Srwatson
693191731Srwatson	MAC_POLICY_CHECK(vnode_check_readdir, cred, dvp, dvp->v_label);
694189503Srwatson	MAC_CHECK_PROBE2(vnode_check_readdir, error, cred, dvp);
695189503Srwatson
696100979Srwatson	return (error);
697100979Srwatson}
698100979Srwatson
699189503SrwatsonMAC_CHECK_PROBE_DEFINE2(vnode_check_readlink, "struct ucred *",
700189503Srwatson    "struct vnode *");
701189503Srwatson
702100979Srwatsonint
703172930Srwatsonmac_vnode_check_readlink(struct ucred *cred, struct vnode *vp)
704100979Srwatson{
705100979Srwatson	int error;
706100979Srwatson
707172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_readlink");
708100979Srwatson
709191731Srwatson	MAC_POLICY_CHECK(vnode_check_readlink, cred, vp, vp->v_label);
710189503Srwatson	MAC_CHECK_PROBE2(vnode_check_readlink, error, cred, vp);
711189503Srwatson
712100979Srwatson	return (error);
713100979Srwatson}
714100979Srwatson
715189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_relabel, "struct ucred *",
716189503Srwatson    "struct vnode *", "struct label *");
717189503Srwatson
718100979Srwatsonstatic int
719172930Srwatsonmac_vnode_check_relabel(struct ucred *cred, struct vnode *vp,
720100979Srwatson    struct label *newlabel)
721100979Srwatson{
722100979Srwatson	int error;
723100979Srwatson
724172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_relabel");
725100979Srwatson
726191731Srwatson	MAC_POLICY_CHECK(vnode_check_relabel, cred, vp, vp->v_label, newlabel);
727189503Srwatson	MAC_CHECK_PROBE3(vnode_check_relabel, error, cred, vp, newlabel);
728100979Srwatson
729100979Srwatson	return (error);
730100979Srwatson}
731100979Srwatson
732189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_rename_from, "struct ucred *",
733189503Srwatson    "struct vnode *", "struct vnode *", "struct componentname *");
734189503Srwatson
735100979Srwatsonint
736172930Srwatsonmac_vnode_check_rename_from(struct ucred *cred, struct vnode *dvp,
737100979Srwatson    struct vnode *vp, struct componentname *cnp)
738100979Srwatson{
739100979Srwatson	int error;
740100979Srwatson
741172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_check_rename_from");
742172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_rename_from");
743100979Srwatson
744191731Srwatson	MAC_POLICY_CHECK(vnode_check_rename_from, cred, dvp, dvp->v_label, vp,
745122524Srwatson	    vp->v_label, cnp);
746189503Srwatson	MAC_CHECK_PROBE4(vnode_check_rename_from, error, cred, dvp, vp, cnp);
747189503Srwatson
748100979Srwatson	return (error);
749100979Srwatson}
750100979Srwatson
751189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_rename_to, "struct ucred *",
752189503Srwatson    "struct vnode *", "struct vnode *", "struct componentname *");
753189503Srwatson
754100979Srwatsonint
755172930Srwatsonmac_vnode_check_rename_to(struct ucred *cred, struct vnode *dvp,
756100979Srwatson    struct vnode *vp, int samedir, struct componentname *cnp)
757100979Srwatson{
758100979Srwatson	int error;
759100979Srwatson
760172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_check_rename_to");
761172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_rename_to");
762100979Srwatson
763191731Srwatson	MAC_POLICY_CHECK(vnode_check_rename_to, cred, dvp, dvp->v_label, vp,
764122524Srwatson	    vp != NULL ? vp->v_label : NULL, samedir, cnp);
765189503Srwatson	MAC_CHECK_PROBE4(vnode_check_rename_to, error, cred, dvp, vp, cnp);
766100979Srwatson	return (error);
767100979Srwatson}
768100979Srwatson
769189503SrwatsonMAC_CHECK_PROBE_DEFINE2(vnode_check_revoke, "struct ucred *",
770189503Srwatson    "struct vnode *");
771189503Srwatson
772100979Srwatsonint
773172930Srwatsonmac_vnode_check_revoke(struct ucred *cred, struct vnode *vp)
774100979Srwatson{
775100979Srwatson	int error;
776100979Srwatson
777172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_revoke");
778100979Srwatson
779191731Srwatson	MAC_POLICY_CHECK(vnode_check_revoke, cred, vp, vp->v_label);
780189503Srwatson	MAC_CHECK_PROBE2(vnode_check_revoke, error, cred, vp);
781189503Srwatson
782100979Srwatson	return (error);
783100979Srwatson}
784100979Srwatson
785189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_setacl, "struct ucred *",
786255971Smarkj    "struct vnode *", "acl_type_t", "struct acl *");
787189503Srwatson
788100979Srwatsonint
789172930Srwatsonmac_vnode_check_setacl(struct ucred *cred, struct vnode *vp, acl_type_t type,
790100979Srwatson    struct acl *acl)
791100979Srwatson{
792100979Srwatson	int error;
793100979Srwatson
794172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_setacl");
795100979Srwatson
796191731Srwatson	MAC_POLICY_CHECK(vnode_check_setacl, cred, vp, vp->v_label, type, acl);
797189503Srwatson	MAC_CHECK_PROBE4(vnode_check_setacl, error, cred, vp, type, acl);
798189503Srwatson
799100979Srwatson	return (error);
800100979Srwatson}
801100979Srwatson
802189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_setextattr, "struct ucred *",
803189503Srwatson    "struct vnode *", "int", "const char *");
804189503Srwatson
805100979Srwatsonint
806172930Srwatsonmac_vnode_check_setextattr(struct ucred *cred, struct vnode *vp,
807189533Srwatson    int attrnamespace, const char *name)
808100979Srwatson{
809100979Srwatson	int error;
810100979Srwatson
811172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_setextattr");
812100979Srwatson
813191731Srwatson	MAC_POLICY_CHECK(vnode_check_setextattr, cred, vp, vp->v_label,
814189533Srwatson	    attrnamespace, name);
815189503Srwatson	MAC_CHECK_PROBE4(vnode_check_setextattr, error, cred, vp,
816189503Srwatson	    attrnamespace, name);
817189503Srwatson
818100979Srwatson	return (error);
819100979Srwatson}
820100979Srwatson
821189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_setflags, "struct ucred *",
822189503Srwatson    "struct vnode *", "u_long");
823189503Srwatson
824100979Srwatsonint
825172930Srwatsonmac_vnode_check_setflags(struct ucred *cred, struct vnode *vp, u_long flags)
826100979Srwatson{
827100979Srwatson	int error;
828100979Srwatson
829172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_setflags");
830100979Srwatson
831191731Srwatson	MAC_POLICY_CHECK(vnode_check_setflags, cred, vp, vp->v_label, flags);
832189503Srwatson	MAC_CHECK_PROBE3(vnode_check_setflags, error, cred, vp, flags);
833189503Srwatson
834100979Srwatson	return (error);
835100979Srwatson}
836100979Srwatson
837189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_setmode, "struct ucred *",
838189503Srwatson    "struct vnode *", "mode_t");
839189503Srwatson
840100979Srwatsonint
841172930Srwatsonmac_vnode_check_setmode(struct ucred *cred, struct vnode *vp, mode_t mode)
842100979Srwatson{
843100979Srwatson	int error;
844100979Srwatson
845172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_setmode");
846100979Srwatson
847191731Srwatson	MAC_POLICY_CHECK(vnode_check_setmode, cred, vp, vp->v_label, mode);
848189503Srwatson	MAC_CHECK_PROBE3(vnode_check_setmode, error, cred, vp, mode);
849189503Srwatson
850100979Srwatson	return (error);
851100979Srwatson}
852100979Srwatson
853189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_setowner, "struct ucred *",
854189503Srwatson    "struct vnode *", "uid_t", "gid_t");
855189503Srwatson
856100979Srwatsonint
857172930Srwatsonmac_vnode_check_setowner(struct ucred *cred, struct vnode *vp, uid_t uid,
858100979Srwatson    gid_t gid)
859100979Srwatson{
860100979Srwatson	int error;
861100979Srwatson
862172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_setowner");
863100979Srwatson
864191731Srwatson	MAC_POLICY_CHECK(vnode_check_setowner, cred, vp, vp->v_label, uid, gid);
865189503Srwatson	MAC_CHECK_PROBE4(vnode_check_setowner, error, cred, vp, uid, gid);
866189503Srwatson
867100979Srwatson	return (error);
868100979Srwatson}
869100979Srwatson
870189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_setutimes, "struct ucred *",
871189503Srwatson    "struct vnode *", "struct timespec *", "struct timespec *");
872189503Srwatson
873100979Srwatsonint
874172930Srwatsonmac_vnode_check_setutimes(struct ucred *cred, struct vnode *vp,
875100979Srwatson    struct timespec atime, struct timespec mtime)
876100979Srwatson{
877100979Srwatson	int error;
878100979Srwatson
879172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_setutimes");
880100979Srwatson
881191731Srwatson	MAC_POLICY_CHECK(vnode_check_setutimes, cred, vp, vp->v_label, atime,
882100979Srwatson	    mtime);
883189503Srwatson	MAC_CHECK_PROBE4(vnode_check_setutimes, error, cred, vp, &atime,
884189503Srwatson	    &mtime);
885189503Srwatson
886100979Srwatson	return (error);
887100979Srwatson}
888100979Srwatson
889189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_stat, "struct ucred *", "struct ucred *",
890189503Srwatson    "struct vnode *");
891189503Srwatson
892100979Srwatsonint
893172930Srwatsonmac_vnode_check_stat(struct ucred *active_cred, struct ucred *file_cred,
894102129Srwatson    struct vnode *vp)
895100979Srwatson{
896100979Srwatson	int error;
897100979Srwatson
898172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_stat");
899100979Srwatson
900191731Srwatson	MAC_POLICY_CHECK(vnode_check_stat, active_cred, file_cred, vp,
901122524Srwatson	    vp->v_label);
902189503Srwatson	MAC_CHECK_PROBE3(vnode_check_stat, error, active_cred, file_cred,
903189503Srwatson	    vp);
904189503Srwatson
905100979Srwatson	return (error);
906100979Srwatson}
907100979Srwatson
908189503SrwatsonMAC_CHECK_PROBE_DEFINE4(vnode_check_unlink, "struct ucred *",
909189503Srwatson    "struct vnode *", "struct vnode *", "struct componentname *");
910189503Srwatson
911102112Srwatsonint
912172953Srwatsonmac_vnode_check_unlink(struct ucred *cred, struct vnode *dvp,
913172953Srwatson    struct vnode *vp, struct componentname *cnp)
914172107Srwatson{
915172107Srwatson	int error;
916172107Srwatson
917172930Srwatson	ASSERT_VOP_LOCKED(dvp, "mac_vnode_check_unlink");
918172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_unlink");
919172107Srwatson
920191731Srwatson	MAC_POLICY_CHECK(vnode_check_unlink, cred, dvp, dvp->v_label, vp,
921172107Srwatson	    vp->v_label, cnp);
922189503Srwatson	MAC_CHECK_PROBE4(vnode_check_unlink, error, cred, dvp, vp, cnp);
923189503Srwatson
924172107Srwatson	return (error);
925172107Srwatson}
926172107Srwatson
927189503SrwatsonMAC_CHECK_PROBE_DEFINE3(vnode_check_write, "struct ucred *",
928189503Srwatson    "struct ucred *", "struct vnode *");
929189503Srwatson
930172107Srwatsonint
931172930Srwatsonmac_vnode_check_write(struct ucred *active_cred, struct ucred *file_cred,
932102129Srwatson    struct vnode *vp)
933102112Srwatson{
934102112Srwatson	int error;
935102112Srwatson
936172930Srwatson	ASSERT_VOP_LOCKED(vp, "mac_vnode_check_write");
937102112Srwatson
938191731Srwatson	MAC_POLICY_CHECK(vnode_check_write, active_cred, file_cred, vp,
939122524Srwatson	    vp->v_label);
940189503Srwatson	MAC_CHECK_PROBE3(vnode_check_write, error, active_cred, file_cred,
941189503Srwatson	    vp);
942102112Srwatson
943102112Srwatson	return (error);
944102112Srwatson}
945102112Srwatson
946107271Srwatsonvoid
947172953Srwatsonmac_vnode_relabel(struct ucred *cred, struct vnode *vp,
948172953Srwatson    struct label *newlabel)
949100979Srwatson{
950100979Srwatson
951191731Srwatson	MAC_POLICY_PERFORM(vnode_relabel, cred, vp, vp->v_label, newlabel);
952100979Srwatson}
953100979Srwatson
954100979Srwatsonvoid
955172930Srwatsonmac_mount_create(struct ucred *cred, struct mount *mp)
956100979Srwatson{
957100979Srwatson
958191731Srwatson	MAC_POLICY_PERFORM(mount_create, cred, mp, mp->mnt_label);
959100979Srwatson}
960100979Srwatson
961189503SrwatsonMAC_CHECK_PROBE_DEFINE2(mount_check_stat, "struct ucred *",
962189503Srwatson    "struct mount *");
963189503Srwatson
964100979Srwatsonint
965172930Srwatsonmac_mount_check_stat(struct ucred *cred, struct mount *mount)
966100979Srwatson{
967100979Srwatson	int error;
968100979Srwatson
969191731Srwatson	MAC_POLICY_CHECK_NOSLEEP(mount_check_stat, cred, mount, mount->mnt_label);
970189503Srwatson	MAC_CHECK_PROBE2(mount_check_stat, error, cred, mount);
971100979Srwatson
972100979Srwatson	return (error);
973100979Srwatson}
974100979Srwatson
975100979Srwatsonvoid
976172930Srwatsonmac_devfs_create_device(struct ucred *cred, struct mount *mp,
977147982Srwatson    struct cdev *dev, struct devfs_dirent *de)
978100979Srwatson{
979100979Srwatson
980191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(devfs_create_device, cred, mp, dev, de,
981189797Srwatson	    de->de_label);
982100979Srwatson}
983100979Srwatson
984104533Srwatsonvoid
985172930Srwatsonmac_devfs_create_symlink(struct ucred *cred, struct mount *mp,
986107698Srwatson    struct devfs_dirent *dd, struct devfs_dirent *de)
987104533Srwatson{
988104533Srwatson
989191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(devfs_create_symlink, cred, mp, dd,
990189797Srwatson	    dd->de_label, de, de->de_label);
991104533Srwatson}
992104533Srwatson
993100979Srwatsonvoid
994172930Srwatsonmac_devfs_create_directory(struct mount *mp, char *dirname, int dirnamelen,
995100979Srwatson    struct devfs_dirent *de)
996100979Srwatson{
997100979Srwatson
998191731Srwatson	MAC_POLICY_PERFORM_NOSLEEP(devfs_create_directory, mp, dirname,
999191731Srwatson	    dirnamelen, de, de->de_label);
1000100979Srwatson}
1001100979Srwatson
1002100979Srwatson/*
1003172953Srwatson * Implementation of VOP_SETLABEL() that relies on extended attributes to
1004172953Srwatson * store label data.  Can be referenced by filesystems supporting extended
1005172953Srwatson * attributes.
1006100979Srwatson */
1007100979Srwatsonint
1008100979Srwatsonvop_stdsetlabel_ea(struct vop_setlabel_args *ap)
1009100979Srwatson{
1010100979Srwatson	struct vnode *vp = ap->a_vp;
1011100979Srwatson	struct label *intlabel = ap->a_label;
1012100979Srwatson	int error;
1013100979Srwatson
1014100979Srwatson	ASSERT_VOP_LOCKED(vp, "vop_stdsetlabel_ea");
1015100979Srwatson
1016105988Srwatson	if ((vp->v_mount->mnt_flag & MNT_MULTILABEL) == 0)
1017105988Srwatson		return (EOPNOTSUPP);
1018100979Srwatson
1019172930Srwatson	error = mac_vnode_setlabel_extattr(ap->a_cred, vp, intlabel);
1020100979Srwatson	if (error)
1021100979Srwatson		return (error);
1022100979Srwatson
1023172930Srwatson	mac_vnode_relabel(ap->a_cred, vp, intlabel);
1024100979Srwatson
1025100979Srwatson	return (0);
1026100979Srwatson}
1027100979Srwatson
1028121367Srwatsonint
1029100979Srwatsonvn_setlabel(struct vnode *vp, struct label *intlabel, struct ucred *cred)
1030100979Srwatson{
1031100979Srwatson	int error;
1032100979Srwatson
1033100979Srwatson	if (vp->v_mount == NULL) {
1034100979Srwatson		/* printf("vn_setlabel: null v_mount\n"); */
1035103314Snjl		if (vp->v_type != VNON)
1036103314Snjl			printf("vn_setlabel: null v_mount with non-VNON\n");
1037100979Srwatson		return (EBADF);
1038100979Srwatson	}
1039100979Srwatson
1040100979Srwatson	if ((vp->v_mount->mnt_flag & MNT_MULTILABEL) == 0)
1041100979Srwatson		return (EOPNOTSUPP);
1042100979Srwatson
1043100979Srwatson	/*
1044100979Srwatson	 * Multi-phase commit.  First check the policies to confirm the
1045165428Srwatson	 * change is OK.  Then commit via the filesystem.  Finally, update
1046165428Srwatson	 * the actual vnode label.
1047165428Srwatson	 *
1048165428Srwatson	 * Question: maybe the filesystem should update the vnode at the end
1049165428Srwatson	 * as part of VOP_SETLABEL()?
1050100979Srwatson	 */
1051172930Srwatson	error = mac_vnode_check_relabel(cred, vp, intlabel);
1052100979Srwatson	if (error)
1053100979Srwatson		return (error);
1054100979Srwatson
1055100979Srwatson	/*
1056100979Srwatson	 * VADMIN provides the opportunity for the filesystem to make
1057165428Srwatson	 * decisions about who is and is not able to modify labels and
1058165428Srwatson	 * protections on files.  This might not be right.  We can't assume
1059172953Srwatson	 * VOP_SETLABEL() will do it, because we might implement that as part
1060172953Srwatson	 * of vop_stdsetlabel_ea().
1061100979Srwatson	 */
1062100979Srwatson	error = VOP_ACCESS(vp, VADMIN, cred, curthread);
1063100979Srwatson	if (error)
1064100979Srwatson		return (error);
1065100979Srwatson
1066100979Srwatson	error = VOP_SETLABEL(vp, intlabel, cred, curthread);
1067100979Srwatson	if (error)
1068100979Srwatson		return (error);
1069100979Srwatson
1070100979Srwatson	return (0);
1071100979Srwatson}
1072