aboutsummaryrefslogtreecommitdiffstats
path: root/libsigsegv/tests/sigsegv1.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsigsegv/tests/sigsegv1.c')
-rw-r--r--libsigsegv/tests/sigsegv1.c111
1 files changed, 0 insertions, 111 deletions
diff --git a/libsigsegv/tests/sigsegv1.c b/libsigsegv/tests/sigsegv1.c
deleted file mode 100644
index ce006428..00000000
--- a/libsigsegv/tests/sigsegv1.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Test that the handler is called, with the right fault address.
- Copyright (C) 2002-2006, 2008 Bruno Haible <bruno@clisp.org>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
-
-#ifndef _MSC_VER
-# include <config.h>
-#endif
-
-#include "sigsegv.h"
-#include <stdio.h>
-
-#if HAVE_SIGSEGV_RECOVERY
-
-#include "mmaputil.h"
-#include <stdlib.h>
-
-unsigned long page;
-
-volatile int handler_called = 0;
-
-int
-handler (void *fault_address, int serious)
-{
- handler_called++;
- if (handler_called > 10)
- abort ();
- if (fault_address != (void *)(page + 0x678))
- abort ();
- if (mprotect ((void *) page, 0x4000, PROT_READ_WRITE) == 0)
- return 1;
- return 0;
-}
-
-void
-crasher (unsigned long p)
-{
- *(volatile int *) (p + 0x678) = 42;
-}
-
-int
-main ()
-{
- void *p;
-
- /* Preparations. */
-#if !HAVE_MMAP_ANON && !HAVE_MMAP_ANONYMOUS && HAVE_MMAP_DEVZERO
- zero_fd = open ("/dev/zero", O_RDONLY, 0644);
-#endif
-
- /* Setup some mmaped memory. */
- p = mmap_zeromap ((void *) 0x12340000, 0x4000);
- if (p == (void *)(-1))
- {
- fprintf (stderr, "mmap_zeromap failed.\n");
- exit (2);
- }
- page = (unsigned long) p;
-
- /* Make it read-only. */
- if (mprotect ((void *) page, 0x4000, PROT_READ) < 0)
- {
- fprintf (stderr, "mprotect failed.\n");
- exit (2);
- }
- /* Test whether it's possible to make it read-write after it was read-only.
- This is not possible on Cygwin. */
- if (mprotect ((void *) page, 0x4000, PROT_READ_WRITE) < 0
- || mprotect ((void *) page, 0x4000, PROT_READ) < 0)
- {
- fprintf (stderr, "mprotect failed.\n");
- exit (2);
- }
-
- /* Install the SIGSEGV handler. */
- sigsegv_install_handler (&handler);
-
- /* The first write access should invoke the handler and then complete. */
- crasher (page);
- /* The second write access should not invoke the handler. */
- crasher (page);
-
- /* Check that the handler was called only once. */
- if (handler_called != 1)
- exit (1);
- /* Test passed! */
- printf ("Test passed.\n");
- return 0;
-}
-
-#else
-
-int
-main ()
-{
- return 77;
-}
-
-#endif