[PATCH 3/4] stdlib/tst-setcontext.c: Check for clobbering of signal stack
Carlos O'Donell
carlos@redhat.com
Sun Mar 30 21:21:00 GMT 2014
On 03/13/2014 06:45 AM, Will Newton wrote:
> On aarch64 calling swapcontext clobbers the state of the signal
> stack (BZ #16629). Check that the address and size of the signal
> stack before and after the call to swapcontext remains the same.
>
> ChangeLog:
OK to checkin with minor nits fixed.
> 2014-03-13 Will Newton <will.newton@linaro.org>
[BZ #16629]
>
> * stdlib/tst-setcontext.c: Include signal.h.
> (main): Check that the signal stack before and
> after swapcontext is the same (BZ #16629).
Remove (BZ #16629), and use the standard markup as I
indicated. This doesn't mean the issue is fixed by this
checkin, just that it's related to BZ #16629. Don't add
16629 to NEWS until it's fixed.
> ---
> stdlib/tst-setcontext.c | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/stdlib/tst-setcontext.c b/stdlib/tst-setcontext.c
> index ac9deb1..55984a4 100644
> --- a/stdlib/tst-setcontext.c
> +++ b/stdlib/tst-setcontext.c
> @@ -16,6 +16,7 @@
> <http://www.gnu.org/licenses/>. */
>
> #include <errno.h>
> +#include <signal.h>
OK.
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> @@ -144,6 +145,9 @@ main (void)
> atexit (check_called);
>
> char st1[32768];
> + stack_t stack_before, stack_after;
> +
> + sigaltstack(NULL, &stack_before);
OK, get the previous stack.
> puts ("making contexts");
> if (getcontext (&ctx[1]) != 0)
> @@ -207,6 +211,8 @@ main (void)
> puts ("back at main program");
> back_in_main = 1;
>
> + sigaltstack(NULL, &stack_after);
> +
OK, get it again afterwards.
> if (was_in_f1 == 0)
> {
> puts ("didn't reach f1");
> @@ -218,6 +224,21 @@ main (void)
> exit (1);
> }
>
> + /* Check sigaltstack state is not clobbered as in BZ #16629. */
> + if (stack_before.ss_sp != stack_after.ss_sp)
> + {
> + printf ("stack ss_sp mismatch: %p %p\n",
> + stack_before.ss_sp, stack_after.ss_sp);
> + exit (1);
> + }
> +
> + if (stack_before.ss_size != stack_after.ss_size)
> + {
> + printf ("stack ss_size mismatch: %zd %zd\n",
> + stack_before.ss_size, stack_after.ss_size);
> + exit (1);
> + }
OK. Compare and make sure they didn't change.
> +
> puts ("test succeeded");
> return 0;
> }
>
Cheers,
Carlos.
More information about the Libc-alpha
mailing list