2 % (c) The AQUA Project, Glasgow University, 1995
4 %************************************************************************
6 \section[mprotect.lc]{Memory Protection}
8 %************************************************************************
10 Is @mprotect@ POSIX now?
14 #if STACK_CHECK_BY_PAGE_FAULT
16 /* #define STK_CHK_DEBUG */
20 # ifdef HAVE_SYS_TYPES_H
21 # include <sys/types.h>
24 # ifdef HAVE_SYS_MMAN_H
25 # include <sys/mman.h>
28 # if defined(_SC_PAGE_SIZE) && !defined(_SC_PAGESIZE)
29 /* Death to HP-UX. What are standards for, anyway??? */
30 # define _SC_PAGESIZE _SC_PAGE_SIZE
33 # if defined(_SC_PAGESIZE)
34 # define GETPAGESIZE() sysconf(_SC_PAGESIZE)
36 # if defined(HAVE_GETPAGESIZE)
37 # define GETPAGESIZE() getpagesize()
43 #if defined(sunos4_TARGET_OS)
44 extern int getpagesize PROTO((void));
45 extern int mprotect PROTO((caddr_t, size_t, int));
49 unmapMiddleStackPage(addr_, size)
50 char * /*caddr_t*/ addr_;
53 int pagesize = GETPAGESIZE();
55 caddr_t middle = (caddr_t) (((W_) (addr + size / 2)) / pagesize * pagesize);
58 fprintf(stderr, "pagesize: %x\nstack start: %08lx\nstack size: %08lx\nstack middle: %08lx\n",
59 pagesize, addr, size, middle);
62 if (middle < addr || middle + pagesize > addr + size) {
63 fprintf(stderr, "Stack too small; stack overflow trap disabled.\n");
66 if (mprotect(middle, pagesize, PROT_NONE) == -1) {
70 if (install_segv_handler()) {
71 fprintf(stderr, "Can't install SIGSEGV handler for stack overflow check.\n");
76 #endif /* STACK_CHECK_BY_PAGE_FAULT */