[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 2/2] pkl: Add canary to exception and return stacks
From: |
Jose E. Marchesi |
Subject: |
Re: [PATCH 2/2] pkl: Add canary to exception and return stacks |
Date: |
Sun, 26 Dec 2021 19:49:54 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) |
Hi Mohammad.
> 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/.
This is OK for both master and maint/poke-1.
Thanks!
> ---
> 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;