git: 9front

Download patch

ref: 8be6f58936fa56f6624cbe47db453e589092ebf1
parent: ffe7d8e989dc39c4e13eac360f020a39cb190ef9
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Nov 6 12:27:15 EST 2015

kernel: use nicer check in okaddr(), wet floor signs in fixfault()

instead of checking addr+len >= addr, check len >= -addr so
that addr == 0 is never valid for len > 0 even if we decide
to have memory at the zero page so theres never any chance
user can pass in "nil" pointers.

put up some signs where we fall thru the switch cases in
fixfault()

--- a/sys/src/9/port/fault.c
+++ b/sys/src/9/port/fault.c
@@ -237,10 +237,8 @@
 				return -1;
 			*pg = new;
 		}
-		goto common;
-
-	case SG_DATA:
-	common:			/* Demand load/pagein/copy on write */
+		/* wet floor */
+	case SG_DATA:			/* Demand load/pagein/copy on write */
 		if(pagedout(*pg))
 			pio(s, addr, soff, pg);
 
@@ -279,6 +277,7 @@
 			new->ref = 1;
 			*pg = new;
 		}
+		/* wet floor */
 	case SG_FIXED:			/* Never paged out */
 		if (checkaddr && addr == addr2check)
 			(*checkaddr)(addr, s, *pg);
@@ -301,7 +300,7 @@
 {
 	Segment *s;
 
-	if((long)len >= 0 && addr+len >= addr) {
+	if((long)len >= 0 && len <= -addr) {
 		for(;;) {
 			s = seg(up, addr, 0);
 			if(s == nil || (write && (s->type&SG_RONLY)))
--