diff options
author | djm@openbsd.org <djm@openbsd.org> | 2015-01-13 14:51:51 +0000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2015-01-15 21:39:16 +1100 |
commit | 771bb47a1df8b69061f09462e78aa0b66cd594bf (patch) | |
tree | f16f6ad62760772996e627a172254d48b78686aa | |
parent | cfaa57962f8536f3cf0fd7daf4d6a55d6f6de45f (diff) |
upstream commit
implement a SIGINFO handler so we can discern a stuck
fuzz test from a merely glacial one; prompted by and ok markus
-rw-r--r-- | regress/Makefile | 2 | ||||
-rw-r--r-- | regress/unittests/test_helper/fuzz.c | 83 | ||||
-rw-r--r-- | regress/unittests/test_helper/test_helper.c | 26 | ||||
-rw-r--r-- | regress/unittests/test_helper/test_helper.h | 3 |
4 files changed, 92 insertions, 22 deletions
diff --git a/regress/Makefile b/regress/Makefile index 2e068e94a..3d32857c6 100644 --- a/regress/Makefile +++ b/regress/Makefile | |||
@@ -96,7 +96,7 @@ CLEANFILES= t2.out t3.out t6.out1 t6.out2 t7.out t7.out.pub copy.1 copy.2 \ | |||
96 | regress.log failed-regress.log ssh-log-wrapper.sh \ | 96 | regress.log failed-regress.log ssh-log-wrapper.sh \ |
97 | sftp-server.sh sftp-server.log sftp.log setuid-allowed \ | 97 | sftp-server.sh sftp-server.log sftp.log setuid-allowed \ |
98 | data ed25519-agent ed25519-agent.pub key.ed25519-512 \ | 98 | data ed25519-agent ed25519-agent.pub key.ed25519-512 \ |
99 | key.ed25519-512.pub netcat | 99 | key.ed25519-512.pub netcat host_krl_* host_revoked_* user_*key* |
100 | 100 | ||
101 | SUDO_CLEAN+= /var/run/testdata_${USER} /var/run/keycommand_${USER} | 101 | SUDO_CLEAN+= /var/run/testdata_${USER} /var/run/keycommand_${USER} |
102 | 102 | ||
diff --git a/regress/unittests/test_helper/fuzz.c b/regress/unittests/test_helper/fuzz.c index d8e1b7ec0..963bce3dc 100644 --- a/regress/unittests/test_helper/fuzz.c +++ b/regress/unittests/test_helper/fuzz.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: fuzz.c,v 1.4 2014/11/19 13:35:37 krw Exp $ */ | 1 | /* $OpenBSD: fuzz.c,v 1.5 2015/01/13 14:51:51 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2011 Damien Miller <djm@mindrot.org> | 3 | * Copyright (c) 2011 Damien Miller <djm@mindrot.org> |
4 | * | 4 | * |
@@ -20,6 +20,7 @@ | |||
20 | #include "includes.h" | 20 | #include "includes.h" |
21 | 21 | ||
22 | #include <sys/types.h> | 22 | #include <sys/types.h> |
23 | #include <sys/uio.h> | ||
23 | 24 | ||
24 | #include <assert.h> | 25 | #include <assert.h> |
25 | #include <ctype.h> | 26 | #include <ctype.h> |
@@ -29,8 +30,11 @@ | |||
29 | #endif | 30 | #endif |
30 | #include <stdlib.h> | 31 | #include <stdlib.h> |
31 | #include <string.h> | 32 | #include <string.h> |
33 | #include <signal.h> | ||
34 | #include <unistd.h> | ||
32 | 35 | ||
33 | #include "test_helper.h" | 36 | #include "test_helper.h" |
37 | #include "atomicio.h" | ||
34 | 38 | ||
35 | /* #define FUZZ_DEBUG */ | 39 | /* #define FUZZ_DEBUG */ |
36 | 40 | ||
@@ -95,59 +99,73 @@ fuzz_ntop(u_int n) | |||
95 | } | 99 | } |
96 | } | 100 | } |
97 | 101 | ||
98 | void | 102 | static int |
99 | fuzz_dump(struct fuzz *fuzz) | 103 | fuzz_fmt(struct fuzz *fuzz, char *s, size_t n) |
100 | { | 104 | { |
101 | u_char *p = fuzz_ptr(fuzz); | 105 | if (fuzz == NULL) |
102 | size_t i, j, len = fuzz_len(fuzz); | 106 | return -1; |
103 | 107 | ||
104 | switch (fuzz->strategy) { | 108 | switch (fuzz->strategy) { |
105 | case FUZZ_1_BIT_FLIP: | 109 | case FUZZ_1_BIT_FLIP: |
106 | fprintf(stderr, "%s case %zu of %zu (bit: %zu)\n", | 110 | snprintf(s, n, "%s case %zu of %zu (bit: %zu)\n", |
107 | fuzz_ntop(fuzz->strategy), | 111 | fuzz_ntop(fuzz->strategy), |
108 | fuzz->o1, fuzz->slen * 8, fuzz->o1); | 112 | fuzz->o1, fuzz->slen * 8, fuzz->o1); |
109 | break; | 113 | return 0; |
110 | case FUZZ_2_BIT_FLIP: | 114 | case FUZZ_2_BIT_FLIP: |
111 | fprintf(stderr, "%s case %llu of %llu (bits: %zu, %zu)\n", | 115 | snprintf(s, n, "%s case %llu of %llu (bits: %zu, %zu)\n", |
112 | fuzz_ntop(fuzz->strategy), | 116 | fuzz_ntop(fuzz->strategy), |
113 | (((fuzz_ullong)fuzz->o2) * fuzz->slen * 8) + fuzz->o1, | 117 | (((fuzz_ullong)fuzz->o2) * fuzz->slen * 8) + fuzz->o1, |
114 | ((fuzz_ullong)fuzz->slen * 8) * fuzz->slen * 8, | 118 | ((fuzz_ullong)fuzz->slen * 8) * fuzz->slen * 8, |
115 | fuzz->o1, fuzz->o2); | 119 | fuzz->o1, fuzz->o2); |
116 | break; | 120 | return 0; |
117 | case FUZZ_1_BYTE_FLIP: | 121 | case FUZZ_1_BYTE_FLIP: |
118 | fprintf(stderr, "%s case %zu of %zu (byte: %zu)\n", | 122 | snprintf(s, n, "%s case %zu of %zu (byte: %zu)\n", |
119 | fuzz_ntop(fuzz->strategy), | 123 | fuzz_ntop(fuzz->strategy), |
120 | fuzz->o1, fuzz->slen, fuzz->o1); | 124 | fuzz->o1, fuzz->slen, fuzz->o1); |
121 | break; | 125 | return 0; |
122 | case FUZZ_2_BYTE_FLIP: | 126 | case FUZZ_2_BYTE_FLIP: |
123 | fprintf(stderr, "%s case %llu of %llu (bytes: %zu, %zu)\n", | 127 | snprintf(s, n, "%s case %llu of %llu (bytes: %zu, %zu)\n", |
124 | fuzz_ntop(fuzz->strategy), | 128 | fuzz_ntop(fuzz->strategy), |
125 | (((fuzz_ullong)fuzz->o2) * fuzz->slen) + fuzz->o1, | 129 | (((fuzz_ullong)fuzz->o2) * fuzz->slen) + fuzz->o1, |
126 | ((fuzz_ullong)fuzz->slen) * fuzz->slen, | 130 | ((fuzz_ullong)fuzz->slen) * fuzz->slen, |
127 | fuzz->o1, fuzz->o2); | 131 | fuzz->o1, fuzz->o2); |
128 | break; | 132 | return 0; |
129 | case FUZZ_TRUNCATE_START: | 133 | case FUZZ_TRUNCATE_START: |
130 | fprintf(stderr, "%s case %zu of %zu (offset: %zu)\n", | 134 | snprintf(s, n, "%s case %zu of %zu (offset: %zu)\n", |
131 | fuzz_ntop(fuzz->strategy), | 135 | fuzz_ntop(fuzz->strategy), |
132 | fuzz->o1, fuzz->slen, fuzz->o1); | 136 | fuzz->o1, fuzz->slen, fuzz->o1); |
133 | break; | 137 | return 0; |
134 | case FUZZ_TRUNCATE_END: | 138 | case FUZZ_TRUNCATE_END: |
135 | fprintf(stderr, "%s case %zu of %zu (offset: %zu)\n", | 139 | snprintf(s, n, "%s case %zu of %zu (offset: %zu)\n", |
136 | fuzz_ntop(fuzz->strategy), | 140 | fuzz_ntop(fuzz->strategy), |
137 | fuzz->o1, fuzz->slen, fuzz->o1); | 141 | fuzz->o1, fuzz->slen, fuzz->o1); |
138 | break; | 142 | return 0; |
139 | case FUZZ_BASE64: | 143 | case FUZZ_BASE64: |
140 | assert(fuzz->o2 < sizeof(fuzz_b64chars) - 1); | 144 | assert(fuzz->o2 < sizeof(fuzz_b64chars) - 1); |
141 | fprintf(stderr, "%s case %llu of %llu (offset: %zu char: %c)\n", | 145 | snprintf(s, n, "%s case %llu of %llu (offset: %zu char: %c)\n", |
142 | fuzz_ntop(fuzz->strategy), | 146 | fuzz_ntop(fuzz->strategy), |
143 | (fuzz->o1 * (fuzz_ullong)64) + fuzz->o2, | 147 | (fuzz->o1 * (fuzz_ullong)64) + fuzz->o2, |
144 | fuzz->slen * (fuzz_ullong)64, fuzz->o1, | 148 | fuzz->slen * (fuzz_ullong)64, fuzz->o1, |
145 | fuzz_b64chars[fuzz->o2]); | 149 | fuzz_b64chars[fuzz->o2]); |
146 | break; | 150 | return 0; |
147 | default: | 151 | default: |
152 | return -1; | ||
148 | abort(); | 153 | abort(); |
149 | } | 154 | } |
155 | } | ||
156 | |||
157 | void | ||
158 | fuzz_dump(struct fuzz *fuzz) | ||
159 | { | ||
160 | u_char *p = fuzz_ptr(fuzz); | ||
161 | size_t i, j, len = fuzz_len(fuzz); | ||
162 | char buf[256]; | ||
150 | 163 | ||
164 | if (fuzz_fmt(fuzz, buf, sizeof(buf)) != 0) { | ||
165 | fprintf(stderr, "%s: fuzz invalid\n", __func__); | ||
166 | abort(); | ||
167 | } | ||
168 | fputs(buf, stderr); | ||
151 | fprintf(stderr, "fuzz context %p len = %zu\n", fuzz, len); | 169 | fprintf(stderr, "fuzz context %p len = %zu\n", fuzz, len); |
152 | for (i = 0; i < len; i += 16) { | 170 | for (i = 0; i < len; i += 16) { |
153 | fprintf(stderr, "%.4zd: ", i); | 171 | fprintf(stderr, "%.4zd: ", i); |
@@ -170,6 +188,23 @@ fuzz_dump(struct fuzz *fuzz) | |||
170 | } | 188 | } |
171 | } | 189 | } |
172 | 190 | ||
191 | #ifdef SIGINFO | ||
192 | static struct fuzz *last_fuzz; | ||
193 | |||
194 | static void | ||
195 | siginfo(int unused __unused) | ||
196 | { | ||
197 | char buf[256]; | ||
198 | |||
199 | test_info(buf, sizeof(buf)); | ||
200 | atomicio(vwrite, STDERR_FILENO, buf, strlen(buf)); | ||
201 | if (last_fuzz != NULL) { | ||
202 | fuzz_fmt(last_fuzz, buf, sizeof(buf)); | ||
203 | atomicio(vwrite, STDERR_FILENO, buf, strlen(buf)); | ||
204 | } | ||
205 | } | ||
206 | #endif | ||
207 | |||
173 | struct fuzz * | 208 | struct fuzz * |
174 | fuzz_begin(u_int strategies, const void *p, size_t l) | 209 | fuzz_begin(u_int strategies, const void *p, size_t l) |
175 | { | 210 | { |
@@ -189,6 +224,12 @@ fuzz_begin(u_int strategies, const void *p, size_t l) | |||
189 | FUZZ_DBG(("begin, ret = %p", ret)); | 224 | FUZZ_DBG(("begin, ret = %p", ret)); |
190 | 225 | ||
191 | fuzz_next(ret); | 226 | fuzz_next(ret); |
227 | |||
228 | #ifdef SIGINFO | ||
229 | last_fuzz = ret; | ||
230 | signal(SIGINFO, siginfo); | ||
231 | #endif | ||
232 | |||
192 | return ret; | 233 | return ret; |
193 | } | 234 | } |
194 | 235 | ||
@@ -196,6 +237,10 @@ void | |||
196 | fuzz_cleanup(struct fuzz *fuzz) | 237 | fuzz_cleanup(struct fuzz *fuzz) |
197 | { | 238 | { |
198 | FUZZ_DBG(("cleanup, fuzz = %p", fuzz)); | 239 | FUZZ_DBG(("cleanup, fuzz = %p", fuzz)); |
240 | #ifdef SIGINFO | ||
241 | last_fuzz = NULL; | ||
242 | signal(SIGINFO, SIG_DFL); | ||
243 | #endif | ||
199 | assert(fuzz != NULL); | 244 | assert(fuzz != NULL); |
200 | assert(fuzz->seed != NULL); | 245 | assert(fuzz->seed != NULL); |
201 | assert(fuzz->fuzzed != NULL); | 246 | assert(fuzz->fuzzed != NULL); |
diff --git a/regress/unittests/test_helper/test_helper.c b/regress/unittests/test_helper/test_helper.c index d0bc67833..6f7f381c7 100644 --- a/regress/unittests/test_helper/test_helper.c +++ b/regress/unittests/test_helper/test_helper.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: test_helper.c,v 1.2 2014/05/02 09:41:32 andre Exp $ */ | 1 | /* $OpenBSD: test_helper.c,v 1.3 2015/01/13 14:51:51 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2011 Damien Miller <djm@mindrot.org> | 3 | * Copyright (c) 2011 Damien Miller <djm@mindrot.org> |
4 | * | 4 | * |
@@ -21,6 +21,7 @@ | |||
21 | 21 | ||
22 | #include <sys/types.h> | 22 | #include <sys/types.h> |
23 | #include <sys/param.h> | 23 | #include <sys/param.h> |
24 | #include <sys/uio.h> | ||
24 | 25 | ||
25 | #include <fcntl.h> | 26 | #include <fcntl.h> |
26 | #include <stdio.h> | 27 | #include <stdio.h> |
@@ -31,6 +32,7 @@ | |||
31 | #include <string.h> | 32 | #include <string.h> |
32 | #include <assert.h> | 33 | #include <assert.h> |
33 | #include <unistd.h> | 34 | #include <unistd.h> |
35 | #include <signal.h> | ||
34 | 36 | ||
35 | #include <openssl/bn.h> | 37 | #include <openssl/bn.h> |
36 | 38 | ||
@@ -39,6 +41,7 @@ | |||
39 | #endif | 41 | #endif |
40 | 42 | ||
41 | #include "test_helper.h" | 43 | #include "test_helper.h" |
44 | #include "atomicio.h" | ||
42 | 45 | ||
43 | #define TEST_CHECK_INT(r, pred) do { \ | 46 | #define TEST_CHECK_INT(r, pred) do { \ |
44 | switch (pred) { \ | 47 | switch (pred) { \ |
@@ -180,6 +183,24 @@ test_data_file(const char *name) | |||
180 | } | 183 | } |
181 | 184 | ||
182 | void | 185 | void |
186 | test_info(char *s, size_t len) | ||
187 | { | ||
188 | snprintf(s, len, "In test %u - \"%s\"\n", test_number, | ||
189 | active_test_name == NULL ? "<none>" : active_test_name); | ||
190 | } | ||
191 | |||
192 | #ifdef SIGINFO | ||
193 | static void | ||
194 | siginfo(int unused __unused) | ||
195 | { | ||
196 | char buf[256]; | ||
197 | |||
198 | test_info(buf, sizeof(buf)); | ||
199 | atomicio(vwrite, STDERR_FILENO, buf, strlen(buf)); | ||
200 | } | ||
201 | #endif | ||
202 | |||
203 | void | ||
183 | test_start(const char *n) | 204 | test_start(const char *n) |
184 | { | 205 | { |
185 | assert(active_test_name == NULL); | 206 | assert(active_test_name == NULL); |
@@ -187,6 +208,9 @@ test_start(const char *n) | |||
187 | if (verbose_mode) | 208 | if (verbose_mode) |
188 | printf("test %u - \"%s\": ", test_number, active_test_name); | 209 | printf("test %u - \"%s\": ", test_number, active_test_name); |
189 | test_number++; | 210 | test_number++; |
211 | #ifdef SIGINFO | ||
212 | signal(SIGINFO, siginfo); | ||
213 | #endif | ||
190 | } | 214 | } |
191 | 215 | ||
192 | void | 216 | void |
diff --git a/regress/unittests/test_helper/test_helper.h b/regress/unittests/test_helper/test_helper.h index a398c615f..b6a39ea3e 100644 --- a/regress/unittests/test_helper/test_helper.h +++ b/regress/unittests/test_helper/test_helper.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: test_helper.h,v 1.3 2014/05/02 09:41:32 andre Exp $ */ | 1 | /* $OpenBSD: test_helper.h,v 1.4 2015/01/13 14:51:51 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2011 Damien Miller <djm@mindrot.org> | 3 | * Copyright (c) 2011 Damien Miller <djm@mindrot.org> |
4 | * | 4 | * |
@@ -40,6 +40,7 @@ void tests(void); | |||
40 | 40 | ||
41 | const char *test_data_file(const char *name); | 41 | const char *test_data_file(const char *name); |
42 | void test_start(const char *n); | 42 | void test_start(const char *n); |
43 | void test_info(char *s, size_t len); | ||
43 | void set_onerror_func(test_onerror_func_t *f, void *ctx); | 44 | void set_onerror_func(test_onerror_func_t *f, void *ctx); |
44 | void test_done(void); | 45 | void test_done(void); |
45 | void ssl_err_check(const char *file, int line); | 46 | void ssl_err_check(const char *file, int line); |