diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2020-09-30 17:16:05 -0400 | 
|---|---|---|
| committer | Robert Morris <rtm@csail.mit.edu> | 2020-09-30 17:16:05 -0400 | 
| commit | 788b4d1bc9a761212fe4f611cb02e8d34aca1775 (patch) | |
| tree | 242ad7bda75888612d5da2ada59e95ac847c0072 /user | |
| parent | 2055fe13ac413a53d74baafdfa47e4c892ff9dc9 (diff) | |
| parent | 05074badc447ce9532824924bfc41a003579beb0 (diff) | |
| download | xv6-labs-788b4d1bc9a761212fe4f611cb02e8d34aca1775.tar.gz xv6-labs-788b4d1bc9a761212fe4f611cb02e8d34aca1775.tar.bz2 xv6-labs-788b4d1bc9a761212fe4f611cb02e8d34aca1775.zip | |
Merge branch 'riscv' of g.csail.mit.edu:xv6-dev into riscv
Diffstat (limited to 'user')
| -rw-r--r-- | user/usertests.c | 48 | 
1 files changed, 48 insertions, 0 deletions
| diff --git a/user/usertests.c b/user/usertests.c index 004c948..7300574 100644 --- a/user/usertests.c +++ b/user/usertests.c @@ -233,6 +233,53 @@ copyinstr3(char *s)    }  } +// See if the kernel refuses to read/write user memory that the +// application doesn't have anymore, because it returned it. +void +rwsbrk() +{ +  int fd, n; +   +  uint64 a = (uint64) sbrk(8192); + +  if(a == 0xffffffffffffffffLL) { +    printf("sbrk(rwsbrk) failed\n"); +    exit(1); +  } +   +  if ((uint64) sbrk(-8192) ==  0xffffffffffffffffLL) { +    printf("sbrk(rwsbrk) shrink failed\n"); +    exit(1); +  } + +  fd = open("rwsbrk", O_CREATE|O_WRONLY); +  if(fd < 0){ +    printf("open(rwsbrk) failed\n"); +    exit(1); +  } +  n = write(fd, (void*)(a+4096), 1024); +  if(n >= 0){ +    printf("write(fd, %p, 1024) returned %d, not -1\n", a+4096, n); +    exit(1); +  } +  close(fd); +  unlink("rwsbrk"); + +  fd = open("README", O_RDONLY); +  if(fd < 0){ +    printf("open(rwsbrk) failed\n"); +    exit(1); +  } +  n = read(fd, (void*)(a+4096), 10); +  if(n >= 0){ +    printf("read(fd, %p, 10) returned %d, not -1\n", a+4096, n); +    exit(1); +  } +  close(fd); +   +  exit(0); +} +  // test O_TRUNC.  void  truncate1(char *s) @@ -2644,6 +2691,7 @@ main(int argc, char *argv[])      {copyinstr1, "copyinstr1"},      {copyinstr2, "copyinstr2"},      {copyinstr3, "copyinstr3"}, +    {rwsbrk, "rwsbrk" },      {truncate1, "truncate1"},      {truncate2, "truncate2"},      {truncate3, "truncate3"}, | 
