poke-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]