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: releng/10.3/sys/security/mac/mac_vfs.c 255971 2013-10-01 15:40:27Z markj $"); 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