|
8 | 8 | #include <errno.h>
|
9 | 9 | #include <poll.h>
|
10 | 10 | #include <unistd.h>
|
| 11 | +#include <setjmp.h> |
11 | 12 | #include <string.h>
|
12 | 13 | #include <stdlib.h>
|
13 | 14 | #include <sys/types.h>
|
@@ -229,16 +230,41 @@ struct child_test {
|
229 | 230 | int subtest;
|
230 | 231 | };
|
231 | 232 |
|
| 233 | +static jmp_buf run_test_jmp_buf; |
| 234 | + |
| 235 | +static void child_test_sig_handler(int sig) |
| 236 | +{ |
| 237 | + siglongjmp(run_test_jmp_buf, sig); |
| 238 | +} |
| 239 | + |
232 | 240 | static int run_test_child(struct child_process *process)
|
233 | 241 | {
|
234 |
| - struct child_test *child = container_of(process, struct child_test, process); |
| 242 | + const int signals[] = { |
| 243 | + SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGINT, SIGPIPE, SIGQUIT, SIGSEGV, SIGTERM, |
| 244 | + }; |
| 245 | + static struct child_test *child; |
235 | 246 | int err;
|
236 | 247 |
|
| 248 | + err = sigsetjmp(run_test_jmp_buf, 1); |
| 249 | + if (err) { |
| 250 | + fprintf(stderr, "\n---- unexpected signal (%d) ----\n", err); |
| 251 | + err = err > 0 ? -err : -1; |
| 252 | + goto err_out; |
| 253 | + } |
| 254 | + |
| 255 | + child = container_of(process, struct child_test, process); |
| 256 | + for (size_t i = 0; i < ARRAY_SIZE(signals); i++) |
| 257 | + signal(signals[i], child_test_sig_handler); |
| 258 | + |
237 | 259 | pr_debug("--- start ---\n");
|
238 | 260 | pr_debug("test child forked, pid %d\n", getpid());
|
239 | 261 | err = test_function(child->test, child->subtest)(child->test, child->subtest);
|
240 | 262 | pr_debug("---- end(%d) ----\n", err);
|
| 263 | + |
| 264 | +err_out: |
241 | 265 | fflush(NULL);
|
| 266 | + for (size_t i = 0; i < ARRAY_SIZE(signals); i++) |
| 267 | + signal(signals[i], SIG_DFL); |
242 | 268 | return -err;
|
243 | 269 | }
|
244 | 270 |
|
|
0 commit comments