summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/regress/lib/libc/explicit_bzero/explicit_bzero.c35
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
28static char altstack[SIGSTKSZ];
29
30static void
31setup_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
28static void 41static void
29call_on_stack(void (*fn)(int), void *stack, size_t stacklen) 42call_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
115static char altstack[SIGSTKSZ];
116
117int 120int
118main() 121main()
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);