diff options
author | Andrea Canciani <ranma42@gmail.com> | 2015-10-13 13:35:59 +0200 |
---|---|---|
committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2015-10-16 15:05:02 +0300 |
commit | 9728241bd098bc4260e6cd83997dfecc64adc356 (patch) | |
tree | f0793b65c7743a226efbcaf4ae73720b5f91a30d | |
parent | 7de61d8d14e84623b6fa46506eb74f938287f536 (diff) |
test: Fix fence-image-self-test on Mac
On MacOS X, according to the manpage of mprotect(), "When a program
violates the protections of a page, it gets a SIGBUS or SIGSEGV
signal.", but fence-image-self-test was only accepting a SIGSEGV as
notification of invalid access.
Fixes fence-image-self-test
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
-rw-r--r-- | test/fence-image-self-test.c | 12 | ||||
-rw-r--r-- | test/utils.c | 6 |
2 files changed, 10 insertions, 8 deletions
diff --git a/test/fence-image-self-test.c b/test/fence-image-self-test.c index c8830384..c80b3cf3 100644 --- a/test/fence-image-self-test.c +++ b/test/fence-image-self-test.c @@ -73,7 +73,7 @@ prinfo (const char *fmt, ...) } static void -do_expect_segv (void (*fn)(void *), void *data) +do_expect_signal (void (*fn)(void *), void *data) { struct sigaction sa; @@ -82,6 +82,8 @@ do_expect_segv (void (*fn)(void *), void *data) sa.sa_sigaction = segv_handler; if (sigaction (SIGSEGV, &sa, NULL) == -1) die ("sigaction failed", errno); + if (sigaction (SIGBUS, &sa, NULL) == -1) + die ("sigaction failed", errno); (*fn)(data); @@ -96,7 +98,7 @@ do_expect_segv (void (*fn)(void *), void *data) * to exit with success, and return failure otherwise. */ static pixman_bool_t -expect_segv (void (*fn)(void *), void *data) +expect_signal (void (*fn)(void *), void *data) { pid_t pid, wp; int status; @@ -106,7 +108,7 @@ expect_segv (void (*fn)(void *), void *data) die ("fork failed", errno); if (pid == 0) - do_expect_segv (fn, data); /* never returns */ + do_expect_signal (fn, data); /* never returns */ wp = waitpid (pid, &status, 0); if (wp != pid) @@ -131,9 +133,9 @@ test_read_fault (uint8_t *p, int offset) { prinfo ("*(uint8_t *)(%p + %d)", p, offset); - if (expect_segv (read_u8, p + offset)) + if (expect_signal (read_u8, p + offset)) { - prinfo ("\tSEGV OK\n"); + prinfo ("\tsignal OK\n"); return TRUE; } diff --git a/test/utils.c b/test/utils.c index 86579669..f8e42a5d 100644 --- a/test/utils.c +++ b/test/utils.c @@ -471,9 +471,9 @@ fence_image_destroy (pixman_image_t *image, void *data) * min_width is only a minimum width for the image. The width is aligned up * for the row size to be divisible by both page size and pixel size. * - * If stride_fence is true, the additional page on each row will be armed - * to cause SIGSEVG on all accesses. This should catch all accesses outside - * the valid row pixels. + * If stride_fence is true, the additional page on each row will be + * armed to cause SIGSEGV or SIGBUS on all accesses. This should catch + * all accesses outside the valid row pixels. */ pixman_image_t * fence_image_create_bits (pixman_format_code_t format, |