Module Name:    src
Committed By:   martin
Date:           Tue Aug  2 12:23:08 UTC 2016

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

Log Message:
kobj_machdep() needs a chance to moify the loaded code, so move the code
to protect it read-only a bit later.


To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/sys/kern/subr_kobj.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/subr_kobj.c
diff -u src/sys/kern/subr_kobj.c:1.58 src/sys/kern/subr_kobj.c:1.59
--- src/sys/kern/subr_kobj.c:1.58	Mon Aug  1 15:41:05 2016
+++ src/sys/kern/subr_kobj.c	Tue Aug  2 12:23:08 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_kobj.c,v 1.58 2016/08/01 15:41:05 maxv Exp $	*/
+/*	$NetBSD: subr_kobj.c,v 1.59 2016/08/02 12:23:08 martin Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.58 2016/08/01 15:41:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.59 2016/08/02 12:23:08 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_modular.h"
@@ -757,15 +757,6 @@ kobj_affix(kobj_t ko, const char *name)
 	/* Jettison unneeded memory post-link. */
 	kobj_jettison(ko);
 
-	/* Change the memory protections, when needed. */
-	uvm_km_protect(module_map, ko->ko_text_address, ko->ko_text_size,
-	    VM_PROT_READ|VM_PROT_EXECUTE);
-	if (ko->ko_rodata_address != 0) {
-		uvm_km_protect(module_map, ko->ko_rodata_address,
-		    ko->ko_rodata_size, VM_PROT_READ);
-	}
-
-
 	/*
 	 * Notify MD code that a module has been loaded.
 	 *
@@ -797,8 +788,16 @@ kobj_affix(kobj_t ko, const char *name)
 		ko->ko_loaded = true;
 	}
 
-	/* If there was an error, destroy the whole object. */
-	if (error != 0) {
+	if (error == 0) {
+		/* Change the memory protections, when needed. */
+		uvm_km_protect(module_map, ko->ko_text_address,
+		     ko->ko_text_size, VM_PROT_READ|VM_PROT_EXECUTE);
+		if (ko->ko_rodata_address != 0) {
+			uvm_km_protect(module_map, ko->ko_rodata_address,
+			    ko->ko_rodata_size, VM_PROT_READ);
+		}
+	} else {
+		/* If there was an error, destroy the whole object. */
 		kobj_unload(ko);
 	}
 

Reply via email to