diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-11-06 17:27:15 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-11-06 17:27:15 +0100 |
commit | 00572496ce8e2e3919586a0ce3df1fc457220ae5 (patch) | |
tree | 4c3003d86501d87b6ffcb10e26dcc5f70293e3cc | |
parent | b32300deb06b94f76a4aec144d23bbec3049d85f (diff) | |
download | plan9front-00572496ce8e2e3919586a0ce3df1fc457220ae5.tar.xz |
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()
-rw-r--r-- | sys/src/9/port/fault.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/sys/src/9/port/fault.c b/sys/src/9/port/fault.c index 64832d23f..0d5e1ac5a 100644 --- a/sys/src/9/port/fault.c +++ b/sys/src/9/port/fault.c @@ -237,10 +237,8 @@ fixfault(Segment *s, uintptr addr, int read) 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 @@ fixfault(Segment *s, uintptr addr, int read) 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 @@ okaddr(uintptr addr, ulong len, int write) { 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))) |