Module Name:    src
Committed By:   christos
Date:           Thu Apr  7 03:31:12 UTC 2016

Modified Files:
        src/sys/kern: exec_subr.c kern_pax.c
        src/sys/sys: pax.h
        src/sys/uvm: uvm_mmap.c uvm_unix.c

Log Message:
Add PAX_MPROTECT_DEBUG


To generate a diff of this commit:
cvs rdiff -u -r1.72 -r1.73 src/sys/kern/exec_subr.c
cvs rdiff -u -r1.37 -r1.38 src/sys/kern/kern_pax.c
cvs rdiff -u -r1.18 -r1.19 src/sys/sys/pax.h
cvs rdiff -u -r1.154 -r1.155 src/sys/uvm/uvm_mmap.c
cvs rdiff -u -r1.45 -r1.46 src/sys/uvm/uvm_unix.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/exec_subr.c
diff -u src/sys/kern/exec_subr.c:1.72 src/sys/kern/exec_subr.c:1.73
--- src/sys/kern/exec_subr.c:1.72	Sat Sep 26 12:12:24 2015
+++ src/sys/kern/exec_subr.c	Wed Apr  6 23:31:12 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: exec_subr.c,v 1.72 2015/09/26 16:12:24 maxv Exp $	*/
+/*	$NetBSD: exec_subr.c,v 1.73 2016/04/07 03:31:12 christos Exp $	*/
 
 /*
  * Copyright (c) 1993, 1994, 1996 Christopher G. Demetriou
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.72 2015/09/26 16:12:24 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.73 2016/04/07 03:31:12 christos Exp $");
 
 #include "opt_pax.h"
 
@@ -184,9 +184,7 @@ vmcmd_map_pagedvn(struct lwp *l, struct 
 
 	prot = cmd->ev_prot;
 	maxprot = UVM_PROT_ALL;
-#ifdef PAX_MPROTECT
-	pax_mprotect(l, &prot, &maxprot);
-#endif /* PAX_MPROTECT */
+	PAX_MPROTECT_ADJUST(l, &prot, &maxprot);
 
 	/*
 	 * check the file system's opinion about mmapping the file
@@ -266,9 +264,7 @@ vmcmd_readvn(struct lwp *l, struct exec_
 
 	prot = cmd->ev_prot;
 	maxprot = VM_PROT_ALL;
-#ifdef PAX_MPROTECT
-	pax_mprotect(l, &prot, &maxprot);
-#endif /* PAX_MPROTECT */
+	PAX_MPROTECT_ADJUST(l, &prot, &maxprot);
 
 #ifdef PMAP_NEED_PROCWR
 	/*
@@ -326,9 +322,7 @@ vmcmd_map_zero(struct lwp *l, struct exe
 
 	prot = cmd->ev_prot;
 	maxprot = UVM_PROT_ALL;
-#ifdef PAX_MPROTECT
-	pax_mprotect(l, &prot, &maxprot);
-#endif /* PAX_MPROTECT */
+	PAX_MPROTECT_ADJUST(l, &prot, &maxprot);
 
 	error = uvm_map(&p->p_vmspace->vm_map, &cmd->ev_addr,
 			round_page(cmd->ev_len), NULL, UVM_UNKNOWN_OFFSET, 0,

Index: src/sys/kern/kern_pax.c
diff -u src/sys/kern/kern_pax.c:1.37 src/sys/kern/kern_pax.c:1.38
--- src/sys/kern/kern_pax.c:1.37	Mon Apr  4 12:47:39 2016
+++ src/sys/kern/kern_pax.c	Wed Apr  6 23:31:12 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_pax.c,v 1.37 2016/04/04 16:47:39 christos Exp $	*/
+/*	$NetBSD: kern_pax.c,v 1.38 2016/04/07 03:31:12 christos Exp $	*/
 
 /*
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_pax.c,v 1.37 2016/04/04 16:47:39 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_pax.c,v 1.38 2016/04/07 03:31:12 christos Exp $");
 
 #include "opt_pax.h"
 
@@ -114,6 +114,9 @@ static int pax_mprotect_enabled = 1;
 static int pax_mprotect_global = PAX_MPROTECT;
 static bool pax_mprotect_elf_flags_active(uint32_t);
 #endif /* PAX_MPROTECT */
+#ifdef PAX_MPROTECT_DEBUG
+int pax_mprotect_debug;
+#endif
 
 #ifdef PAX_SEGVGUARD
 #ifndef PAX_SEGVGUARD_EXPIRY
@@ -189,6 +192,14 @@ SYSCTL_SETUP(sysctl_security_pax_setup, 
 				    "all processes."),
 		       NULL, 0, &pax_mprotect_global, 0,
 		       CTL_CREATE, CTL_EOL);
+#ifdef PAX_MPROTECT_DEBUG
+	sysctl_createv(clog, 0, &rnode, NULL,
+		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+		       CTLTYPE_INT, "debug",
+		       SYSCTL_DESCR("print mprotect changes."),
+		       NULL, 0, &pax_mprotect_debug, 0,
+		       CTL_CREATE, CTL_EOL);
+#endif
 #endif /* PAX_MPROTECT */
 
 #ifdef PAX_SEGVGUARD
@@ -354,7 +365,11 @@ pax_mprotect_elf_flags_active(uint32_t f
 }
 
 void
-pax_mprotect(struct lwp *l, vm_prot_t *prot, vm_prot_t *maxprot)
+pax_mprotect_adjust(
+#ifdef PAX_MPROTECT_DEBUG
+    const char *file, size_t line,
+#endif
+    struct lwp *l, vm_prot_t *prot, vm_prot_t *maxprot)
 {
 	uint32_t flags;
 
@@ -363,18 +378,24 @@ pax_mprotect(struct lwp *l, vm_prot_t *p
 		return;
 
 	if ((*prot & (VM_PROT_WRITE|VM_PROT_EXECUTE)) != VM_PROT_EXECUTE) {
-#ifdef DIAGNOSTIC
+#ifdef PAX_MPROTECT_DEBUG
 		struct proc *p = l->l_proc;
-		printf("%s: %d.%d (%s): clearing execute bit\n", __func__,
-		    p->p_pid, l->l_lid, p->p_comm);
+		if (pax_mprotect_debug) {
+			printf("%s: %s,%zu: %d.%d (%s): -x\n",
+			    __func__, file, line,
+			    p->p_pid, l->l_lid, p->p_comm);
+		}
 #endif
 		*prot &= ~VM_PROT_EXECUTE;
 		*maxprot &= ~VM_PROT_EXECUTE;
 	} else {
-#ifdef DIAGNOSTIC
+#ifdef PAX_MPROTECT_DEBUG
 		struct proc *p = l->l_proc;
-		printf("%s: %d.%d (%s): clearing write bit\n", __func__,
-		    p->p_pid, l->l_lid, p->p_comm);
+		if (pax_mprotect_debug) {
+			printf("%s: %s,%zu: %d.%d (%s): -w\n",
+			    __func__, file, line,
+			    p->p_pid, l->l_lid, p->p_comm);
+		}
 #endif
 		*prot &= ~VM_PROT_WRITE;
 		*maxprot &= ~VM_PROT_WRITE;

Index: src/sys/sys/pax.h
diff -u src/sys/sys/pax.h:1.18 src/sys/sys/pax.h:1.19
--- src/sys/sys/pax.h:1.18	Sun Mar 20 10:58:11 2016
+++ src/sys/sys/pax.h	Wed Apr  6 23:31:12 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: pax.h,v 1.18 2016/03/20 14:58:11 khorben Exp $ */
+/* $NetBSD: pax.h,v 1.19 2016/04/07 03:31:12 christos Exp $ */
 
 /*-
  * Copyright (c) 2006 Elad Efrat <e...@netbsd.org>
@@ -54,7 +54,22 @@ extern int pax_aslr_debug;
 
 void pax_init(void);
 void pax_setup_elf_flags(struct exec_package *, uint32_t);
-void pax_mprotect(struct lwp *, vm_prot_t *, vm_prot_t *);
+void pax_mprotect_adjust(
+#ifdef PAX_MPROTECT_DEBUG
+    const char *, size_t,
+#endif
+    struct lwp *, vm_prot_t *, vm_prot_t *);
+#ifndef PAX_MPROTECT
+# define PAX_MPROTECT_ADJUST(a, b, c)
+#else
+# ifdef PAX_MPROTECT_DEBUG
+#  define PAX_MPROTECT_ADJUST(a, b, c) \
+    pax_mprotect_adjust(__FILE__, __LINE__, (a), (b), (c))
+# else
+#  define PAX_MPROTECT_ADJUST(a, b, c) \
+    pax_mprotect_adjust((a), (b), (c))
+# endif
+#endif
 int pax_segvguard(struct lwp *, struct vnode *, const char *, bool);
 
 #define	PAX_ASLR_DELTA(delta, lsb, len)	\

Index: src/sys/uvm/uvm_mmap.c
diff -u src/sys/uvm/uvm_mmap.c:1.154 src/sys/uvm/uvm_mmap.c:1.155
--- src/sys/uvm/uvm_mmap.c:1.154	Thu Nov 26 08:15:34 2015
+++ src/sys/uvm/uvm_mmap.c	Wed Apr  6 23:31:12 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_mmap.c,v 1.154 2015/11/26 13:15:34 martin Exp $	*/
+/*	$NetBSD: uvm_mmap.c,v 1.155 2016/04/07 03:31:12 christos Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -46,7 +46,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.154 2015/11/26 13:15:34 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.155 2016/04/07 03:31:12 christos Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_pax.h"
@@ -418,9 +418,7 @@ sys_mmap(struct lwp *l, const struct sys
 		pos = 0;
 	}
 
-#ifdef PAX_MPROTECT
-	pax_mprotect(l, &prot, &maxprot);
-#endif /* PAX_MPROTECT */
+	PAX_MPROTECT_ADJUST(l, &prot, &maxprot);
 
 #ifdef PAX_ASLR
 	pax_aslr_mmap(l, &addr, orig_addr, flags);

Index: src/sys/uvm/uvm_unix.c
diff -u src/sys/uvm/uvm_unix.c:1.45 src/sys/uvm/uvm_unix.c:1.46
--- src/sys/uvm/uvm_unix.c:1.45	Fri Sep  5 01:36:49 2014
+++ src/sys/uvm/uvm_unix.c	Wed Apr  6 23:31:12 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_unix.c,v 1.45 2014/09/05 05:36:49 matt Exp $	*/
+/*	$NetBSD: uvm_unix.c,v 1.46 2016/04/07 03:31:12 christos Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_unix.c,v 1.45 2014/09/05 05:36:49 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_unix.c,v 1.46 2016/04/07 03:31:12 christos Exp $");
 
 #include "opt_pax.h"
 
@@ -103,9 +103,7 @@ sys_obreak(struct lwp *l, const struct s
 		vm_prot_t prot = UVM_PROT_READ | UVM_PROT_WRITE;
 		vm_prot_t maxprot = UVM_PROT_ALL;
 
-#ifdef PAX_MPROTECT
-		pax_mprotect(l, &prot, &maxprot);
-#endif /* PAX_MPROTECT */
+		PAX_MPROTECT_ADJUST(l, &prot, &maxprot);
 
 		error = uvm_map(&vm->vm_map, &obreak, nbreak - obreak, NULL,
 		    UVM_UNKNOWN_OFFSET, 0,

Reply via email to