summaryrefslogtreecommitdiffstats
path: root/sys/security/mac/mac_process.c
diff options
context:
space:
mode:
authorcsjp <csjp@FreeBSD.org>2005-10-04 14:32:15 +0000
committercsjp <csjp@FreeBSD.org>2005-10-04 14:32:15 +0000
commit2c5fc2505489b5a5869ec9a9ec70eeb587660e91 (patch)
treed1afc95ff3a95727f417ca3fba4d878a9caace25 /sys/security/mac/mac_process.c
parent587186ed9b09254d3109b430d9bea436e72da6bd (diff)
downloadFreeBSD-src-2c5fc2505489b5a5869ec9a9ec70eeb587660e91.zip
FreeBSD-src-2c5fc2505489b5a5869ec9a9ec70eeb587660e91.tar.gz
Conditionally pickup Giant in mac_cred_mmapped_drop_perms_recurse so
we can drop it all together in __mac_set_proc. Reviewed by: alc Discussed with: rwatson
Diffstat (limited to 'sys/security/mac/mac_process.c')
-rw-r--r--sys/security/mac/mac_process.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/security/mac/mac_process.c b/sys/security/mac/mac_process.c
index 436c55b..170670c 100644
--- a/sys/security/mac/mac_process.c
+++ b/sys/security/mac/mac_process.c
@@ -325,7 +325,7 @@ mac_cred_mmapped_drop_perms_recurse(struct thread *td, struct ucred *cred,
struct vm_map *map)
{
struct vm_map_entry *vme;
- int result;
+ int vfslocked, result;
vm_prot_t revokeperms;
vm_object_t object;
vm_ooffset_t offset;
@@ -366,6 +366,7 @@ mac_cred_mmapped_drop_perms_recurse(struct thread *td, struct ucred *cred,
if (object->type != OBJT_VNODE)
continue;
vp = (struct vnode *)object->handle;
+ vfslocked = VFS_LOCK_GIANT(vp->v_mount);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
result = vme->max_protection;
mac_check_vnode_mmap_downgrade(cred, vp, &result);
@@ -375,8 +376,10 @@ mac_cred_mmapped_drop_perms_recurse(struct thread *td, struct ucred *cred,
* now but a policy needs to get removed.
*/
revokeperms = vme->max_protection & ~result;
- if (!revokeperms)
+ if (!revokeperms) {
+ VFS_UNLOCK_GIANT(vfslocked);
continue;
+ }
printf("pid %ld: revoking %s perms from %#lx:%ld "
"(max %s/cur %s)\n", (long)td->td_proc->p_pid,
prot2str(revokeperms), (u_long)vme->start,
@@ -436,6 +439,7 @@ mac_cred_mmapped_drop_perms_recurse(struct thread *td, struct ucred *cred,
vm_map_simplify_entry(map, vme);
}
vm_map_lock_downgrade(map);
+ VFS_UNLOCK_GIANT(vfslocked);
}
vm_map_unlock_read(map);
}
OpenPOWER on IntegriCloud