Index: kern/vfs_syscalls.c =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/kern/vfs_syscalls.c,v retrieving revision 1.442 diff -u -r1.442 vfs_syscalls.c --- kern/vfs_syscalls.c 28 Aug 2007 20:28:11 -0000 1.442 +++ kern/vfs_syscalls.c 31 Aug 2007 21:12:10 -0000 @@ -1693,7 +1693,7 @@ goto restart; } #ifdef MAC - error = mac_check_vnode_delete(td->td_ucred, nd.ni_dvp, vp, + error = mac_check_vnode_unlink(td->td_ucred, nd.ni_dvp, vp, &nd.ni_cnd); if (error) goto out; @@ -3550,7 +3550,7 @@ goto out; } #ifdef MAC - error = mac_check_vnode_delete(td->td_ucred, nd.ni_dvp, vp, + error = mac_check_vnode_unlink(td->td_ucred, nd.ni_dvp, vp, &nd.ni_cnd); if (error) goto out; Index: security/mac/mac_framework.h =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/security/mac/mac_framework.h,v retrieving revision 1.83 diff -u -r1.83 mac_framework.h --- security/mac/mac_framework.h 26 Jun 2007 14:14:01 -0000 1.83 +++ security/mac/mac_framework.h 26 Aug 2007 19:09:03 -0000 @@ -351,8 +351,6 @@ int mac_check_vnode_chroot(struct ucred *cred, struct vnode *dvp); int mac_check_vnode_create(struct ucred *cred, struct vnode *dvp, struct componentname *cnp, struct vattr *vap); -int mac_check_vnode_delete(struct ucred *cred, struct vnode *dvp, - struct vnode *vp, struct componentname *cnp); int mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp, acl_type_t type); int mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp, @@ -400,6 +398,8 @@ struct timespec atime, struct timespec mtime); int mac_check_vnode_stat(struct ucred *active_cred, struct ucred *file_cred, struct vnode *vp); +int mac_check_vnode_unlink(struct ucred *cred, struct vnode *dvp, + struct vnode *vp, struct componentname *cnp); int mac_check_vnode_write(struct ucred *active_cred, struct ucred *file_cred, struct vnode *vp); int mac_getsockopt_label(struct ucred *cred, struct socket *so, Index: security/mac/mac_policy.h =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/security/mac/mac_policy.h,v retrieving revision 1.93 diff -u -r1.93 mac_policy.h --- security/mac/mac_policy.h 5 Jul 2007 06:45:37 -0000 1.93 +++ security/mac/mac_policy.h 26 Aug 2007 19:09:50 -0000 @@ -524,10 +524,6 @@ typedef int (*mpo_check_vnode_create_t)(struct ucred *cred, struct vnode *dvp, struct label *dvplabel, struct componentname *cnp, struct vattr *vap); -typedef int (*mpo_check_vnode_delete_t)(struct ucred *cred, - struct vnode *dvp, struct label *dvplabel, - struct vnode *vp, struct label *vplabel, - struct componentname *cnp); typedef int (*mpo_check_vnode_deleteacl_t)(struct ucred *cred, struct vnode *vp, struct label *vplabel, acl_type_t type); @@ -604,6 +600,10 @@ typedef int (*mpo_check_vnode_stat_t)(struct ucred *active_cred, struct ucred *file_cred, struct vnode *vp, struct label *vplabel); +typedef int (*mpo_check_vnode_unlink_t)(struct ucred *cred, + struct vnode *dvp, struct label *dvplabel, + struct vnode *vp, struct label *vplabel, + struct componentname *cnp); typedef int (*mpo_check_vnode_write_t)(struct ucred *active_cred, struct ucred *file_cred, struct vnode *vp, struct label *vplabel); @@ -868,7 +868,6 @@ mpo_check_vnode_chdir_t mpo_check_vnode_chdir; mpo_check_vnode_chroot_t mpo_check_vnode_chroot; mpo_check_vnode_create_t mpo_check_vnode_create; - mpo_check_vnode_delete_t mpo_check_vnode_delete; mpo_check_vnode_deleteacl_t mpo_check_vnode_deleteacl; mpo_check_vnode_deleteextattr_t mpo_check_vnode_deleteextattr; mpo_check_vnode_exec_t mpo_check_vnode_exec; @@ -897,6 +896,7 @@ mpo_check_vnode_setowner_t mpo_check_vnode_setowner; mpo_check_vnode_setutimes_t mpo_check_vnode_setutimes; mpo_check_vnode_stat_t mpo_check_vnode_stat; + mpo_check_vnode_unlink_t mpo_check_vnode_unlink; mpo_check_vnode_write_t mpo_check_vnode_write; mpo_associate_nfsd_label_t mpo_associate_nfsd_label; mpo_create_mbuf_from_firewall_t mpo_create_mbuf_from_firewall; Index: security/mac/mac_vfs.c =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/security/mac/mac_vfs.c,v retrieving revision 1.121 diff -u -r1.121 mac_vfs.c --- security/mac/mac_vfs.c 23 Apr 2007 13:36:53 -0000 1.121 +++ security/mac/mac_vfs.c 26 Aug 2007 19:10:34 -0000 @@ -391,20 +391,6 @@ } int -mac_check_vnode_delete(struct ucred *cred, struct vnode *dvp, struct vnode *vp, - struct componentname *cnp) -{ - int error; - - ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_delete"); - ASSERT_VOP_LOCKED(vp, "mac_check_vnode_delete"); - - MAC_CHECK(check_vnode_delete, cred, dvp, dvp->v_label, vp, - vp->v_label, cnp); - return (error); -} - -int mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp, acl_type_t type) { @@ -741,6 +727,20 @@ } int +mac_check_vnode_unlink(struct ucred *cred, struct vnode *dvp, struct vnode *vp, + struct componentname *cnp) +{ + int error; + + ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_unlink"); + ASSERT_VOP_LOCKED(vp, "mac_check_vnode_unlink"); + + MAC_CHECK(check_vnode_unlink, cred, dvp, dvp->v_label, vp, + vp->v_label, cnp); + return (error); +} + +int mac_check_vnode_write(struct ucred *active_cred, struct ucred *file_cred, struct vnode *vp) { Index: security/mac_biba/mac_biba.c =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/security/mac_biba/mac_biba.c,v retrieving revision 1.106 diff -u -r1.106 mac_biba.c --- security/mac_biba/mac_biba.c 23 Apr 2007 13:36:53 -0000 1.106 +++ security/mac_biba/mac_biba.c 2 Sep 2007 11:46:58 -0000 @@ -2625,30 +2625,6 @@ } static int -mac_biba_check_vnode_delete(struct ucred *cred, struct vnode *dvp, - struct label *dvplabel, struct vnode *vp, struct label *vplabel, - struct componentname *cnp) -{ - struct mac_biba *subj, *obj; - - if (!mac_biba_enabled) - return (0); - - subj = SLOT(cred->cr_label); - obj = SLOT(dvplabel); - - if (!mac_biba_dominate_effective(subj, obj)) - return (EACCES); - - obj = SLOT(vplabel); - - if (!mac_biba_dominate_effective(subj, obj)) - return (EACCES); - - return (0); -} - -static int mac_biba_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp, struct label *vplabel, acl_type_t type) { @@ -3187,6 +3163,30 @@ } static int +mac_biba_check_vnode_unlink(struct ucred *cred, struct vnode *dvp, + struct label *dvplabel, struct vnode *vp, struct label *vplabel, + struct componentname *cnp) +{ + struct mac_biba *subj, *obj; + + if (!mac_biba_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(dvplabel); + + if (!mac_biba_dominate_effective(subj, obj)) + return (EACCES); + + obj = SLOT(vplabel); + + if (!mac_biba_dominate_effective(subj, obj)) + return (EACCES); + + return (0); +} + +static int mac_biba_check_vnode_write(struct ucred *active_cred, struct ucred *file_cred, struct vnode *vp, struct label *vplabel) { @@ -3389,7 +3389,6 @@ .mpo_check_vnode_chdir = mac_biba_check_vnode_chdir, .mpo_check_vnode_chroot = mac_biba_check_vnode_chroot, .mpo_check_vnode_create = mac_biba_check_vnode_create, - .mpo_check_vnode_delete = mac_biba_check_vnode_delete, .mpo_check_vnode_deleteacl = mac_biba_check_vnode_deleteacl, .mpo_check_vnode_deleteextattr = mac_biba_check_vnode_deleteextattr, .mpo_check_vnode_exec = mac_biba_check_vnode_exec, @@ -3415,6 +3414,7 @@ .mpo_check_vnode_setowner = mac_biba_check_vnode_setowner, .mpo_check_vnode_setutimes = mac_biba_check_vnode_setutimes, .mpo_check_vnode_stat = mac_biba_check_vnode_stat, + .mpo_check_vnode_unlink = mac_biba_check_vnode_unlink, .mpo_check_vnode_write = mac_biba_check_vnode_write, .mpo_associate_nfsd_label = mac_biba_associate_nfsd_label, .mpo_create_mbuf_from_firewall = mac_biba_create_mbuf_from_firewall, Index: security/mac_bsdextended/mac_bsdextended.c =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/security/mac_bsdextended/mac_bsdextended.c,v retrieving revision 1.38 diff -u -r1.38 mac_bsdextended.c --- security/mac_bsdextended/mac_bsdextended.c 5 Jul 2007 13:16:04 -0000 1.38 +++ security/mac_bsdextended/mac_bsdextended.c 2 Sep 2007 11:47:40 -0000 @@ -504,19 +504,6 @@ } static int -mac_bsdextended_check_vnode_delete(struct ucred *cred, struct vnode *dvp, - struct label *dvplabel, struct vnode *vp, struct label *vplabel, - struct componentname *cnp) -{ - int error; - - error = mac_bsdextended_check_vp(cred, dvp, MBI_WRITE); - if (error) - return (error); - return (mac_bsdextended_check_vp(cred, vp, MBI_WRITE)); -} - -static int mac_bsdextended_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp, struct label *vplabel, acl_type_t type) { @@ -708,6 +695,19 @@ return (mac_bsdextended_check_vp(active_cred, vp, MBI_STAT)); } +static int +mac_bsdextended_check_vnode_unlink(struct ucred *cred, struct vnode *dvp, + struct label *dvplabel, struct vnode *vp, struct label *vplabel, + struct componentname *cnp) +{ + int error; + + error = mac_bsdextended_check_vp(cred, dvp, MBI_WRITE); + if (error) + return (error); + return (mac_bsdextended_check_vp(cred, vp, MBI_WRITE)); +} + static struct mac_policy_ops mac_bsdextended_ops = { .mpo_destroy = mac_bsdextended_destroy, @@ -720,7 +720,6 @@ .mpo_check_vnode_chdir = mac_bsdextended_check_vnode_chdir, .mpo_check_vnode_chroot = mac_bsdextended_check_vnode_chroot, .mpo_check_vnode_create = mac_bsdextended_check_create_vnode, - .mpo_check_vnode_delete = mac_bsdextended_check_vnode_delete, .mpo_check_vnode_deleteacl = mac_bsdextended_check_vnode_deleteacl, .mpo_check_vnode_deleteextattr = mac_bsdextended_check_vnode_deleteextattr, .mpo_check_vnode_exec = mac_bsdextended_check_vnode_exec, @@ -742,6 +741,7 @@ .mpo_check_vnode_setowner = mac_bsdextended_check_vnode_setowner, .mpo_check_vnode_setutimes = mac_bsdextended_check_vnode_setutimes, .mpo_check_vnode_stat = mac_bsdextended_check_vnode_stat, + .mpo_check_vnode_unlink = mac_bsdextended_check_vnode_unlink, }; MAC_POLICY_SET(&mac_bsdextended_ops, mac_bsdextended, Index: security/mac_lomac/mac_lomac.c =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/security/mac_lomac/mac_lomac.c,v retrieving revision 1.51 diff -u -r1.51 mac_lomac.c --- security/mac_lomac/mac_lomac.c 5 Jun 2007 00:00:56 -0000 1.51 +++ security/mac_lomac/mac_lomac.c 26 Aug 2007 19:29:41 -0000 @@ -2345,30 +2345,6 @@ } static int -mac_lomac_check_vnode_delete(struct ucred *cred, struct vnode *dvp, - struct label *dvplabel, struct vnode *vp, struct label *vplabel, - struct componentname *cnp) -{ - struct mac_lomac *subj, *obj; - - if (!mac_lomac_enabled) - return (0); - - subj = SLOT(cred->cr_label); - obj = SLOT(dvplabel); - - if (!mac_lomac_subject_dominate(subj, obj)) - return (EACCES); - - obj = SLOT(vplabel); - - if (!mac_lomac_subject_dominate(subj, obj)) - return (EACCES); - - return (0); -} - -static int mac_lomac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp, struct label *vplabel, acl_type_t type) { @@ -2753,6 +2729,30 @@ } static int +mac_lomac_check_vnode_unlink(struct ucred *cred, struct vnode *dvp, + struct label *dvplabel, struct vnode *vp, struct label *vplabel, + struct componentname *cnp) +{ + struct mac_lomac *subj, *obj; + + if (!mac_lomac_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(dvplabel); + + if (!mac_lomac_subject_dominate(subj, obj)) + return (EACCES); + + obj = SLOT(vplabel); + + if (!mac_lomac_subject_dominate(subj, obj)) + return (EACCES); + + return (0); +} + +static int mac_lomac_check_vnode_write(struct ucred *active_cred, struct ucred *file_cred, struct vnode *vp, struct label *vplabel) { @@ -2933,7 +2933,6 @@ .mpo_check_system_sysctl = mac_lomac_check_system_sysctl, .mpo_check_vnode_access = mac_lomac_check_vnode_open, .mpo_check_vnode_create = mac_lomac_check_vnode_create, - .mpo_check_vnode_delete = mac_lomac_check_vnode_delete, .mpo_check_vnode_deleteacl = mac_lomac_check_vnode_deleteacl, .mpo_check_vnode_link = mac_lomac_check_vnode_link, .mpo_check_vnode_mmap = mac_lomac_check_vnode_mmap, @@ -2950,6 +2949,7 @@ .mpo_check_vnode_setmode = mac_lomac_check_vnode_setmode, .mpo_check_vnode_setowner = mac_lomac_check_vnode_setowner, .mpo_check_vnode_setutimes = mac_lomac_check_vnode_setutimes, + .mpo_check_vnode_unlink = mac_lomac_check_vnode_unlink, .mpo_check_vnode_write = mac_lomac_check_vnode_write, .mpo_thread_userret = mac_lomac_thread_userret, .mpo_create_mbuf_from_firewall = mac_lomac_create_mbuf_from_firewall, Index: security/mac_mls/mac_mls.c =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/security/mac_mls/mac_mls.c,v retrieving revision 1.87 diff -u -r1.87 mac_mls.c --- security/mac_mls/mac_mls.c 23 Jul 2007 13:28:54 -0000 1.87 +++ security/mac_mls/mac_mls.c 2 Sep 2007 11:48:14 -0000 @@ -2272,30 +2272,6 @@ } static int -mac_mls_check_vnode_delete(struct ucred *cred, struct vnode *dvp, - struct label *dvplabel, struct vnode *vp, struct label *vplabel, - struct componentname *cnp) -{ - struct mac_mls *subj, *obj; - - if (!mac_mls_enabled) - return (0); - - subj = SLOT(cred->cr_label); - obj = SLOT(dvplabel); - - if (!mac_mls_dominate_effective(obj, subj)) - return (EACCES); - - obj = SLOT(vplabel); - - if (!mac_mls_dominate_effective(obj, subj)) - return (EACCES); - - return (0); -} - -static int mac_mls_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp, struct label *vplabel, acl_type_t type) { @@ -2834,6 +2810,30 @@ } static int +mac_mls_check_vnode_unlink(struct ucred *cred, struct vnode *dvp, + struct label *dvplabel, struct vnode *vp, struct label *vplabel, + struct componentname *cnp) +{ + struct mac_mls *subj, *obj; + + if (!mac_mls_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(dvplabel); + + if (!mac_mls_dominate_effective(obj, subj)) + return (EACCES); + + obj = SLOT(vplabel); + + if (!mac_mls_dominate_effective(obj, subj)) + return (EACCES); + + return (0); +} + +static int mac_mls_check_vnode_write(struct ucred *active_cred, struct ucred *file_cred, struct vnode *vp, struct label *vplabel) { @@ -3011,7 +3011,6 @@ .mpo_check_vnode_chdir = mac_mls_check_vnode_chdir, .mpo_check_vnode_chroot = mac_mls_check_vnode_chroot, .mpo_check_vnode_create = mac_mls_check_vnode_create, - .mpo_check_vnode_delete = mac_mls_check_vnode_delete, .mpo_check_vnode_deleteacl = mac_mls_check_vnode_deleteacl, .mpo_check_vnode_deleteextattr = mac_mls_check_vnode_deleteextattr, .mpo_check_vnode_exec = mac_mls_check_vnode_exec, @@ -3037,6 +3036,7 @@ .mpo_check_vnode_setowner = mac_mls_check_vnode_setowner, .mpo_check_vnode_setutimes = mac_mls_check_vnode_setutimes, .mpo_check_vnode_stat = mac_mls_check_vnode_stat, + .mpo_check_vnode_unlink = mac_mls_check_vnode_unlink, .mpo_check_vnode_write = mac_mls_check_vnode_write, .mpo_associate_nfsd_label = mac_mls_associate_nfsd_label, .mpo_create_mbuf_from_firewall = mac_mls_create_mbuf_from_firewall, Index: security/mac_stub/mac_stub.c =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/security/mac_stub/mac_stub.c,v retrieving revision 1.67 diff -u -r1.67 mac_stub.c --- security/mac_stub/mac_stub.c 26 Jun 2007 14:14:01 -0000 1.67 +++ security/mac_stub/mac_stub.c 2 Sep 2007 11:48:49 -0000 @@ -1183,15 +1183,6 @@ } static int -stub_check_vnode_delete(struct ucred *cred, struct vnode *dvp, - struct label *dvplabel, struct vnode *vp, struct label *vplabel, - struct componentname *cnp) -{ - - return (0); -} - -static int stub_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp, struct label *vplabel, acl_type_t type) { @@ -1413,6 +1404,15 @@ } static int +stub_check_vnode_unlink(struct ucred *cred, struct vnode *dvp, + struct label *dvplabel, struct vnode *vp, struct label *vplabel, + struct componentname *cnp) +{ + + return (0); +} + +static int stub_check_vnode_write(struct ucred *active_cred, struct ucred *file_cred, struct vnode *vp, struct label *vplabel) { @@ -1623,7 +1623,6 @@ .mpo_check_vnode_chdir = stub_check_vnode_chdir, .mpo_check_vnode_chroot = stub_check_vnode_chroot, .mpo_check_vnode_create = stub_check_vnode_create, - .mpo_check_vnode_delete = stub_check_vnode_delete, .mpo_check_vnode_deleteacl = stub_check_vnode_deleteacl, .mpo_check_vnode_deleteextattr = stub_check_vnode_deleteextattr, .mpo_check_vnode_exec = stub_check_vnode_exec, @@ -1651,6 +1650,7 @@ .mpo_check_vnode_setowner = stub_check_vnode_setowner, .mpo_check_vnode_setutimes = stub_check_vnode_setutimes, .mpo_check_vnode_stat = stub_check_vnode_stat, + .mpo_check_vnode_unlink = stub_check_vnode_unlink, .mpo_check_vnode_write = stub_check_vnode_write, .mpo_priv_check = stub_priv_check, .mpo_priv_grant = stub_priv_grant, Index: security/mac_test/mac_test.c =================================================================== RCS file: /data/fbsd-cvs/ncvs/src/sys/security/mac_test/mac_test.c,v retrieving revision 1.77 diff -u -r1.77 mac_test.c --- security/mac_test/mac_test.c 26 Jun 2007 14:14:01 -0000 1.77 +++ security/mac_test/mac_test.c 2 Sep 2007 11:49:35 -0000 @@ -2098,21 +2098,6 @@ return (0); } -COUNTER_DECL(check_vnode_delete); -static int -mac_test_check_vnode_delete(struct ucred *cred, struct vnode *dvp, - struct label *dvplabel, struct vnode *vp, struct label *vplabel, - struct componentname *cnp) -{ - - LABEL_CHECK(cred->cr_label, MAGIC_CRED); - LABEL_CHECK(dvplabel, MAGIC_VNODE); - LABEL_CHECK(vplabel, MAGIC_VNODE); - COUNTER_INC(check_vnode_delete); - - return (0); -} - COUNTER_DECL(check_vnode_deleteacl); static int mac_test_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp, @@ -2455,6 +2440,21 @@ return (0); } +COUNTER_DECL(check_vnode_unlink); +static int +mac_test_check_vnode_unlink(struct ucred *cred, struct vnode *dvp, + struct label *dvplabel, struct vnode *vp, struct label *vplabel, + struct componentname *cnp) +{ + + LABEL_CHECK(cred->cr_label, MAGIC_CRED); + LABEL_CHECK(dvplabel, MAGIC_VNODE); + LABEL_CHECK(vplabel, MAGIC_VNODE); + COUNTER_INC(check_vnode_unlink); + + return (0); +} + COUNTER_DECL(check_vnode_write); static int mac_test_check_vnode_write(struct ucred *active_cred, @@ -2656,7 +2656,6 @@ .mpo_check_vnode_chdir = mac_test_check_vnode_chdir, .mpo_check_vnode_chroot = mac_test_check_vnode_chroot, .mpo_check_vnode_create = mac_test_check_vnode_create, - .mpo_check_vnode_delete = mac_test_check_vnode_delete, .mpo_check_vnode_deleteacl = mac_test_check_vnode_deleteacl, .mpo_check_vnode_deleteextattr = mac_test_check_vnode_deleteextattr, .mpo_check_vnode_exec = mac_test_check_vnode_exec, @@ -2682,6 +2681,7 @@ .mpo_check_vnode_setowner = mac_test_check_vnode_setowner, .mpo_check_vnode_setutimes = mac_test_check_vnode_setutimes, .mpo_check_vnode_stat = mac_test_check_vnode_stat, + .mpo_check_vnode_unlink = mac_test_check_vnode_unlink, .mpo_check_vnode_write = mac_test_check_vnode_write, };