diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-03-14 13:11:55 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-03-14 13:11:55 +0100 |
| commit | f8b7ad12f3843134352efd9da7062f3db34283d6 (patch) | |
| tree | 01784adbf0fc978b29ea867d6d2da2cf4781e1e9 | |
| parent | d82476d59fb1076542a163bb2e6534023be43720 (diff) | |
| download | pintos-f8b7ad12f3843134352efd9da7062f3db34283d6.tar.gz | |
check ptr instead of always esp
| -rw-r--r-- | src/userprog/syscall.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/userprog/syscall.c b/src/userprog/syscall.c index 0e0d97e..4d2ce7a 100644 --- a/src/userprog/syscall.c +++ b/src/userprog/syscall.c @@ -182,9 +182,9 @@ ptr_is_valid (const void *ptr) // cast argument N from f->esp to TYPE without dereferencing #define INTR_ESP(N, TYPE) (TYPE *)(f->esp+(4*(N))) -#define CHECK_ESP_AND_MAYBE_EXIT(N) \ +#define CHECK_PTR_AND_MAYBE_EXIT(PTR) \ do { \ - if (!ptr_is_valid ((f->esp+(4*(N))))) { \ + if (!ptr_is_valid (PTR)) { \ exit (-1); \ return; \ } \ @@ -195,10 +195,11 @@ static void syscall_handler (struct intr_frame *f UNUSED) { // check esp - CHECK_ESP_AND_MAYBE_EXIT (0); - int syscall_number = *INTR_ESP (0, int); + int *syscall_number = INTR_ESP (0, int); - switch (syscall_number) { + CHECK_PTR_AND_MAYBE_EXIT (syscall_number); + + switch (*syscall_number) { case 0: // halt halt (); @@ -236,7 +237,7 @@ syscall_handler (struct intr_frame *f UNUSED) close (*INTR_ESP (1, int)); break; default: - printf ("kernel: unknown syscall '%d'\n", syscall_number); + printf ("kernel: unknown syscall '%d'\n", *syscall_number); break; } } |
