Module Name:    src
Committed By:   maxv
Date:           Sat Apr 25 19:10:29 UTC 2015

Modified Files:
        src/sys/kern: kern_veriexec.c

Log Message:
Make veriexec_renamechk() more readable. Also add a KASSERT on vte_count.

No real functional change


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/kern/kern_veriexec.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_veriexec.c
diff -u src/sys/kern/kern_veriexec.c:1.4 src/sys/kern/kern_veriexec.c:1.5
--- src/sys/kern/kern_veriexec.c:1.4	Sat Apr 25 18:43:13 2015
+++ src/sys/kern/kern_veriexec.c	Sat Apr 25 19:10:29 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_veriexec.c,v 1.4 2015/04/25 18:43:13 maxv Exp $	*/
+/*	$NetBSD: kern_veriexec.c,v 1.5 2015/04/25 19:10:29 maxv Exp $	*/
 
 /*-
  * Copyright (c) 2005, 2006 Elad Efrat <e...@netbsd.org>
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_veriexec.c,v 1.4 2015/04/25 18:43:13 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_veriexec.c,v 1.5 2015/04/25 19:10:29 maxv Exp $");
 
 #include "opt_veriexec.h"
 
@@ -878,7 +878,6 @@ veriexec_removechk(struct lwp *l, struct
 		return 0;
 
 	rw_enter(&veriexec_op_lock, RW_READER);
-
 	vfe = veriexec_get(vp);
 	rw_exit(&veriexec_op_lock);
 
@@ -913,7 +912,7 @@ int
 veriexec_renamechk(struct lwp *l, struct vnode *fromvp, const char *fromname,
     struct vnode *tovp, const char *toname)
 {
-	struct veriexec_file_entry *vfe, *tvfe;
+	struct veriexec_file_entry *fvfe = NULL, *tvfe = NULL;
 
 	if (veriexec_bypass && (veriexec_strict == VERIEXEC_LEARNING))
 		return 0;
@@ -924,70 +923,73 @@ veriexec_renamechk(struct lwp *l, struct
 		log(LOG_ALERT, "Veriexec: Preventing rename of `%s' to "
 		    "`%s', uid=%u, pid=%u: Lockdown mode.\n", fromname, toname,
 		    kauth_cred_geteuid(l->l_cred), l->l_proc->p_pid);
-
 		rw_exit(&veriexec_op_lock);
 		return (EPERM);
 	}
 
-	vfe = veriexec_get(fromvp);
-	tvfe = NULL;
+	fvfe = veriexec_get(fromvp);
 	if (tovp != NULL)
 		tvfe = veriexec_get(tovp);
 
-	if ((vfe != NULL) || (tvfe != NULL)) {
-		if (veriexec_strict >= VERIEXEC_IPS) {
-			log(LOG_ALERT, "Veriexec: Preventing rename of `%s' "
-			    "to `%s', uid=%u, pid=%u: IPS mode, %s "
-			    "monitored.\n", fromname, toname,
-			    kauth_cred_geteuid(l->l_cred),
-			    l->l_proc->p_pid, (vfe != NULL && tvfe != NULL) ?
-			    "files" : "file");
+	if ((fvfe == NULL) && (tvfe == NULL)) {
+		/* None of them is monitored */
+		rw_exit(&veriexec_op_lock);
+		return 0;
+	}
 
-			rw_exit(&veriexec_op_lock);
-			return (EPERM);
-		}
+	if (veriexec_strict >= VERIEXEC_IPS) {
+		log(LOG_ALERT, "Veriexec: Preventing rename of `%s' "
+		    "to `%s', uid=%u, pid=%u: IPS mode, %s "
+		    "monitored.\n", fromname, toname,
+		    kauth_cred_geteuid(l->l_cred),
+		    l->l_proc->p_pid, (fvfe != NULL && tvfe != NULL) ?
+		    "files" : "file");
+		rw_exit(&veriexec_op_lock);
+		return (EPERM);
+	}
 
+	if (fvfe != NULL) {
 		/*
 		 * Monitored file is renamed; filename no longer relevant.
-		 *
+		 */
+
+		/*
 		 * XXX: We could keep the buffer, and when (and if) updating the
 		 * XXX: filename post-rename, re-allocate it only if it's not
 		 * XXX: big enough for the new filename.
 		 */
-		if (vfe != NULL) {
-			/* XXXX get write lock on vfe here? */
 
-			VERIEXEC_RW_UPGRADE(&veriexec_op_lock);
-			/* once we have the op lock in write mode
-			 * there should be no locks on any file
-			 * entries so we can destroy the object.
-			 */
+		/* XXX: Get write lock on fvfe here? */
 
-			if (vfe->filename_len > 0)
-				kmem_free(vfe->filename, vfe->filename_len);
+		VERIEXEC_RW_UPGRADE(&veriexec_op_lock);
+		/* once we have the op lock in write mode
+		 * there should be no locks on any file
+		 * entries so we can destroy the object.
+		 */
 
-			vfe->filename = NULL;
-			vfe->filename_len = 0;
+		if (fvfe->filename_len > 0)
+			kmem_free(fvfe->filename, fvfe->filename_len);
 
-			rw_downgrade(&veriexec_op_lock);
-		}
+		fvfe->filename = NULL;
+		fvfe->filename_len = 0;
 
-		log(LOG_NOTICE, "Veriexec: %s file `%s' renamed to "
-		    "%s file `%s', uid=%u, pid=%u.\n", (vfe != NULL) ?
-		    "Monitored" : "Non-monitored", fromname, (tvfe != NULL) ?
-		    "monitored" : "non-monitored", toname,
-		    kauth_cred_geteuid(l->l_cred), l->l_proc->p_pid);
+		rw_downgrade(&veriexec_op_lock);
+	}
 
-		rw_exit(&veriexec_op_lock);
+	log(LOG_NOTICE, "Veriexec: %s file `%s' renamed to "
+	    "%s file `%s', uid=%u, pid=%u.\n", (fvfe != NULL) ?
+	    "Monitored" : "Non-monitored", fromname, (tvfe != NULL) ?
+	    "monitored" : "non-monitored", toname,
+	    kauth_cred_geteuid(l->l_cred), l->l_proc->p_pid);
+
+	rw_exit(&veriexec_op_lock);
 
+	if (tvfe != NULL) {
 		/*
 		 * Monitored file is overwritten. Remove the entry.
 		 */
-		if (tvfe != NULL)
-			(void)veriexec_file_delete(l, tovp);
-
-	} else
-		rw_exit(&veriexec_op_lock);
+		(void)veriexec_file_delete(l, tovp);
+	}
 
 	return (0);
 }
@@ -1337,7 +1339,8 @@ veriexec_file_add(struct lwp *l, prop_di
 }
 
 int
-veriexec_table_delete(struct lwp *l, struct mount *mp) {
+veriexec_table_delete(struct lwp *l, struct mount *mp)
+{
 	struct veriexec_table_entry *vte;
 
 	vte = veriexec_table_lookup(mp);
@@ -1351,7 +1354,8 @@ veriexec_table_delete(struct lwp *l, str
 }
 
 int
-veriexec_file_delete(struct lwp *l, struct vnode *vp) {
+veriexec_file_delete(struct lwp *l, struct vnode *vp)
+{
 	struct veriexec_table_entry *vte;
 	int error;
 
@@ -1362,8 +1366,10 @@ veriexec_file_delete(struct lwp *l, stru
 	rw_enter(&veriexec_op_lock, RW_WRITER);
 	error = fileassoc_clear(vp, veriexec_hook);
 	rw_exit(&veriexec_op_lock);
-	if (!error)
+	if (!error) {
+		KASSERT(vte->vte_count > 0);
 		vte->vte_count--;
+	}
 
 	return (error);
 }

Reply via email to