diff options
| -rw-r--r-- | sys/src/9/port/fault.c | 12 | ||||
| -rw-r--r-- | sys/src/9/port/portfns.h | 2 | ||||
| -rw-r--r-- | sys/src/9/port/syscallfmt.c | 2 | ||||
| -rw-r--r-- | sys/src/9/port/sysproc.c | 2 |
4 files changed, 10 insertions, 8 deletions
diff --git a/sys/src/9/port/fault.c b/sys/src/9/port/fault.c index 6565c670a..00c905b8c 100644 --- a/sys/src/9/port/fault.c +++ b/sys/src/9/port/fault.c @@ -332,18 +332,20 @@ validaddr(uintptr addr, ulong len, int write) * &s[0] is known to be a valid address. */ void* -vmemchr(void *s, int c, int n) +vmemchr(void *s, int c, ulong n) { - int m; uintptr a; + ulong m; void *t; a = (uintptr)s; - while(PGROUND(a) != PGROUND(a+n-1)){ - /* spans pages; handle this page */ + for(;;){ m = BY2PG - (a & (BY2PG-1)); + if(n <= m) + break; + /* spans pages; handle this page */ t = memchr((void*)a, c, m); - if(t) + if(t != nil) return t; a += m; n -= m; diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h index 15ca191a3..6ca7a54ba 100644 --- a/sys/src/9/port/portfns.h +++ b/sys/src/9/port/portfns.h @@ -368,7 +368,7 @@ void validaddr(uintptr, ulong, int); void validname(char*, int); char* validnamedup(char*, int); void validstat(uchar*, int); -void* vmemchr(void*, int, int); +void* vmemchr(void*, int, ulong); Proc* wakeup(Rendez*); int walk(Chan**, char**, int, int, int*); void wlock(RWlock*); diff --git a/sys/src/9/port/syscallfmt.c b/sys/src/9/port/syscallfmt.c index 224f70b82..12610c866 100644 --- a/sys/src/9/port/syscallfmt.c +++ b/sys/src/9/port/syscallfmt.c @@ -44,7 +44,7 @@ fmtuserstring(Fmt* f, char* a, char* suffix) return; } validaddr((uintptr)a, 1, 0); - n = ((char*)vmemchr(a, 0, 0x7fffffff) - a) + 1; + n = ((char*)vmemchr(a, 0, ~0) - a) + 1; t = smalloc(n+1); memmove(t, a, n); t[n] = 0; diff --git a/sys/src/9/port/sysproc.c b/sys/src/9/port/sysproc.c index e755bcf5a..597398cb9 100644 --- a/sys/src/9/port/sysproc.c +++ b/sys/src/9/port/sysproc.c @@ -390,7 +390,7 @@ sysexec(va_list list) if(((uintptr)argp&(BY2PG-1)) < BY2WD) validaddr((uintptr)argp, BY2WD, 0); validaddr((uintptr)a, 1, 0); - nbytes += ((char*)vmemchr(a, 0, 0x7FFFFFFF) - a) + 1; + nbytes += ((char*)vmemchr(a, 0, ~0) - a) + 1; nargs++; } ssize = BY2WD*(nargs+1) + ((nbytes+(BY2WD-1)) & ~(BY2WD-1)); |
