diff options
Diffstat (limited to '')
| -rw-r--r-- | src/regress/lib/libc/explicit_bzero/explicit_bzero.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/regress/lib/libc/explicit_bzero/explicit_bzero.c b/src/regress/lib/libc/explicit_bzero/explicit_bzero.c index d78c4d6054..658d2f1e51 100644 --- a/src/regress/lib/libc/explicit_bzero/explicit_bzero.c +++ b/src/regress/lib/libc/explicit_bzero/explicit_bzero.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: explicit_bzero.c,v 1.2 2014/07/09 14:26:59 bcook Exp $ */ | 1 | /* $OpenBSD: explicit_bzero.c,v 1.3 2014/07/09 18:02:24 matthew Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Google Inc. | 3 | * Copyright (c) 2014 Google Inc. |
| 4 | * | 4 | * |
| @@ -25,8 +25,21 @@ | |||
| 25 | #define ASSERT_NE(a, b) assert((a) != (b)) | 25 | #define ASSERT_NE(a, b) assert((a) != (b)) |
| 26 | #define ASSERT_GE(a, b) assert((a) >= (b)) | 26 | #define ASSERT_GE(a, b) assert((a) >= (b)) |
| 27 | 27 | ||
| 28 | static char altstack[SIGSTKSZ]; | ||
| 29 | |||
| 30 | static void | ||
| 31 | setup_stack(void) | ||
| 32 | { | ||
| 33 | const stack_t sigstk = { | ||
| 34 | .ss_sp = altstack, | ||
| 35 | .ss_size = sizeof(altstack), | ||
| 36 | }; | ||
| 37 | |||
| 38 | ASSERT_EQ(0, sigaltstack(&sigstk, NULL)); | ||
| 39 | } | ||
| 40 | |||
| 28 | static void | 41 | static void |
| 29 | call_on_stack(void (*fn)(int), void *stack, size_t stacklen) | 42 | call_on_stack(void (*fn)(int)) |
| 30 | { | 43 | { |
| 31 | /* | 44 | /* |
| 32 | * This is a bit more complicated than strictly necessary, but | 45 | * This is a bit more complicated than strictly necessary, but |
| @@ -42,12 +55,7 @@ call_on_stack(void (*fn)(int), void *stack, size_t stacklen) | |||
| 42 | .sa_handler = fn, | 55 | .sa_handler = fn, |
| 43 | .sa_flags = SA_ONSTACK, | 56 | .sa_flags = SA_ONSTACK, |
| 44 | }; | 57 | }; |
| 45 | const stack_t sigstk = { | ||
| 46 | .ss_sp = stack, | ||
| 47 | .ss_size = stacklen, | ||
| 48 | }; | ||
| 49 | struct sigaction oldsigact; | 58 | struct sigaction oldsigact; |
| 50 | stack_t oldsigstk; | ||
| 51 | sigset_t sigset, oldsigset; | 59 | sigset_t sigset, oldsigset; |
| 52 | 60 | ||
| 53 | /* First, block all signals. */ | 61 | /* First, block all signals. */ |
| @@ -55,8 +63,7 @@ call_on_stack(void (*fn)(int), void *stack, size_t stacklen) | |||
| 55 | ASSERT_EQ(0, sigfillset(&sigset)); | 63 | ASSERT_EQ(0, sigfillset(&sigset)); |
| 56 | ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &sigset, &oldsigset)); | 64 | ASSERT_EQ(0, sigprocmask(SIG_BLOCK, &sigset, &oldsigset)); |
| 57 | 65 | ||
| 58 | /* Next setup the signal stack and handler for SIGUSR1. */ | 66 | /* Next setup the signal handler for SIGUSR1. */ |
| 59 | ASSERT_EQ(0, sigaltstack(&sigstk, &oldsigstk)); | ||
| 60 | ASSERT_EQ(0, sigaction(SIGUSR1, &sigact, &oldsigact)); | 67 | ASSERT_EQ(0, sigaction(SIGUSR1, &sigact, &oldsigact)); |
| 61 | 68 | ||
| 62 | /* Raise SIGUSR1 and momentarily unblock it to run the handler. */ | 69 | /* Raise SIGUSR1 and momentarily unblock it to run the handler. */ |
| @@ -67,8 +74,6 @@ call_on_stack(void (*fn)(int), void *stack, size_t stacklen) | |||
| 67 | 74 | ||
| 68 | /* Restore the original signal action, stack, and mask. */ | 75 | /* Restore the original signal action, stack, and mask. */ |
| 69 | ASSERT_EQ(0, sigaction(SIGUSR1, &oldsigact, NULL)); | 76 | ASSERT_EQ(0, sigaction(SIGUSR1, &oldsigact, NULL)); |
| 70 | if (oldsigstk.ss_flags & SA_ONSTACK) | ||
| 71 | ASSERT_EQ(0, sigaltstack(&oldsigstk, NULL)); | ||
| 72 | ASSERT_EQ(0, sigprocmask(SIG_SETMASK, &oldsigset, NULL)); | 77 | ASSERT_EQ(0, sigprocmask(SIG_SETMASK, &oldsigset, NULL)); |
| 73 | } | 78 | } |
| 74 | 79 | ||
| @@ -112,11 +117,11 @@ test_with_bzero(int signo) | |||
| 112 | explicit_bzero(buf, sizeof(buf)); | 117 | explicit_bzero(buf, sizeof(buf)); |
| 113 | } | 118 | } |
| 114 | 119 | ||
| 115 | static char altstack[SIGSTKSZ]; | ||
| 116 | |||
| 117 | int | 120 | int |
| 118 | main() | 121 | main() |
| 119 | { | 122 | { |
| 123 | setup_stack(); | ||
| 124 | |||
| 120 | /* | 125 | /* |
| 121 | * First, test that if we *don't* call explicit_bzero, that we | 126 | * First, test that if we *don't* call explicit_bzero, that we |
| 122 | * *are* able to find the secret data on the stack. This | 127 | * *are* able to find the secret data on the stack. This |
| @@ -124,7 +129,7 @@ main() | |||
| 124 | * work as intended. | 129 | * work as intended. |
| 125 | */ | 130 | */ |
| 126 | memset(altstack, 0, sizeof(altstack)); | 131 | memset(altstack, 0, sizeof(altstack)); |
| 127 | call_on_stack(test_without_bzero, altstack, sizeof(altstack)); | 132 | call_on_stack(test_without_bzero); |
| 128 | ASSERT_NE(NULL, memmem(altstack, sizeof(altstack), secret, sizeof(secret))); | 133 | ASSERT_NE(NULL, memmem(altstack, sizeof(altstack), secret, sizeof(secret))); |
| 129 | 134 | ||
| 130 | /* | 135 | /* |
| @@ -132,7 +137,7 @@ main() | |||
| 132 | * *don't* find the secret data. | 137 | * *don't* find the secret data. |
| 133 | */ | 138 | */ |
| 134 | memset(altstack, 0, sizeof(altstack)); | 139 | memset(altstack, 0, sizeof(altstack)); |
| 135 | call_on_stack(test_with_bzero, altstack, sizeof(altstack)); | 140 | call_on_stack(test_with_bzero); |
| 136 | ASSERT_EQ(NULL, memmem(altstack, sizeof(altstack), secret, sizeof(secret))); | 141 | ASSERT_EQ(NULL, memmem(altstack, sizeof(altstack), secret, sizeof(secret))); |
| 137 | 142 | ||
| 138 | return (0); | 143 | return (0); |
