summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-03-14 13:11:55 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-03-14 13:11:55 +0100
commitf8b7ad12f3843134352efd9da7062f3db34283d6 (patch)
tree01784adbf0fc978b29ea867d6d2da2cf4781e1e9
parentd82476d59fb1076542a163bb2e6534023be43720 (diff)
downloadpintos-f8b7ad12f3843134352efd9da7062f3db34283d6.tar.gz
check ptr instead of always esp
-rw-r--r--src/userprog/syscall.c13
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;
}
}