[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] pkl: Add canary to exception and return stacks
From: |
Mohammad-Reza Nabipoor |
Subject: |
[PATCH 2/2] pkl: Add canary to exception and return stacks |
Date: |
Sun, 26 Dec 2021 20:11:20 +0330 |
2021-12-26 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
* libpoke/pvm.jitter (state-struct-backing-c): Remove `canary` field.
Add `canary_{,return,exception}stack` fields.
(state-initialization-c): Init new fields.
(canary): Install canaries for stacks.
(exit): Add assertions for stack canaries.
(strace): s/canary/canary_stack/.
---
ChangeLog | 9 +++++++++
libpoke/pvm.jitter | 28 +++++++++++++++++++++-------
2 files changed, 30 insertions(+), 7 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 0432f5d4..28dab956 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2021-12-26 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
+
+ * libpoke/pvm.jitter (state-struct-backing-c): Remove `canary` field.
+ Add `canary_{,return,exception}stack` fields.
+ (state-initialization-c): Init new fields.
+ (canary): Install canaries for stacks.
+ (exit): Add assertions for stack canaries.
+ (strace): s/canary/canary_stack/.
+
2021-12-26 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
* libpoke/pkl-ast.h (struct pkl_ast_return_stmt): Add new field
diff --git a/libpoke/pvm.jitter b/libpoke/pvm.jitter
index 4c48bef7..38cfc7f1 100644
--- a/libpoke/pvm.jitter
+++ b/libpoke/pvm.jitter
@@ -963,7 +963,9 @@ state-struct-backing-c
code
enum pvm_exit_code exit_code;
pvm_val result_value;
- jitter_stack_height canary;
+ jitter_stack_height canary_stack;
+ jitter_stack_height canary_returnstack;
+ jitter_stack_height canary_exceptionstack;
pvm vm;
end
end
@@ -987,7 +989,9 @@ end
state-initialization-c
code
jitter_state_backing->vm = NULL;
- jitter_state_backing->canary = NULL;
+ jitter_state_backing->canary_stack = NULL;
+ jitter_state_backing->canary_returnstack = NULL;
+ jitter_state_backing->canary_exceptionstack = NULL;
jitter_state_backing->exit_code = PVM_EXIT_OK;
jitter_state_backing->result_value = PVM_NULL;
jitter_state_runtime->endian = IOS_ENDIAN_MSB;
@@ -1027,7 +1031,11 @@ end
instruction canary ()
code
- PVM_STATE_BACKING_FIELD (canary) = JITTER_HEIGHT_STACK ();
+ PVM_STATE_BACKING_FIELD (canary_stack) = JITTER_HEIGHT_STACK ();
+ PVM_STATE_BACKING_FIELD (canary_returnstack) =
+ JITTER_HEIGHT_RETURNSTACK ();
+ PVM_STATE_BACKING_FIELD (canary_exceptionstack) =
+ JITTER_HEIGHT_EXCEPTIONSTACK ();
end
end
@@ -1055,9 +1063,15 @@ instruction exit ()
/* Check for the stack sentinel, but only if it was
installed. */
- if (PVM_STATE_BACKING_FIELD (canary) != NULL)
- assert (PVM_STATE_BACKING_FIELD (canary)
+ if (PVM_STATE_BACKING_FIELD (canary_stack) != NULL)
+ assert (PVM_STATE_BACKING_FIELD (canary_stack)
== JITTER_HEIGHT_STACK ());
+ if (PVM_STATE_BACKING_FIELD (canary_returnstack) != NULL)
+ assert (PVM_STATE_BACKING_FIELD (canary_returnstack)
+ == JITTER_HEIGHT_RETURNSTACK ());
+ if (PVM_STATE_BACKING_FIELD (canary_exceptionstack) != NULL)
+ assert (PVM_STATE_BACKING_FIELD (canary_exceptionstack)
+ == JITTER_HEIGHT_EXCEPTIONSTACK ());
/* Clear pending signals. */
{
@@ -6091,10 +6105,10 @@ instruction strace (?n)
int num_elems = (int) JITTER_ARGN0;
int num_elems_in_stack;
- assert (PVM_STATE_BACKING_FIELD (canary) != NULL);
+ assert (PVM_STATE_BACKING_FIELD (canary_stack) != NULL);
num_elems_in_stack = (pvm_val *)JITTER_HEIGHT_STACK ()
- - (pvm_val *)PVM_STATE_BACKING_FIELD (canary);
+ - (pvm_val *)PVM_STATE_BACKING_FIELD (canary_stack);
if (num_elems == 0 || num_elems > num_elems_in_stack)
num_elems = num_elems_in_stack;
--
2.34.1