diff -ur gc6.5.orig/include/private/gcconfig.h gc6.5/include/private/gcconfig.h --- gc6.5.orig/include/private/gcconfig.h 2005-08-05 00:03:00.000000000 +0200 +++ gc6.5/include/private/gcconfig.h 2005-08-05 00:08:42.000000000 +0200 @@ -1100,6 +1100,9 @@ # endif # define OS_TYPE "LINUX" # define LINUX_STACKBOTTOM + /* On I386 Linux, enable HEURISTIC2 as a backup to /proc data */ + /* for the case where /proc is missing or nobbled (grsec) */ +# define HEURISTIC2 # if 0 # define HEURISTIC1 # undef STACK_GRAN @@ -1901,6 +1904,9 @@ # ifdef LINUX # define OS_TYPE "LINUX" # define LINUX_STACKBOTTOM + /* On x86_64 Linux, enable HEURISTIC2 as a backup to /proc data */ + /* for the case where /proc is missing or nobbled (grsec) */ +# define HEURISTIC2 # if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC) # define MPROTECT_VDB # else diff -ur gc6.5.orig/os_dep.c gc6.5/os_dep.c --- gc6.5.orig/os_dep.c 2005-08-05 00:03:00.000000000 +0200 +++ gc6.5/os_dep.c 2005-08-05 00:07:56.000000000 +0200 @@ -967,7 +967,13 @@ # endif f = open("/proc/self/stat", O_RDONLY); if (f < 0 || STAT_READ(f, stat_buf, STAT_BUF_SIZE) < 2 * STAT_SKIP) { + /* if /proc/self/stat isn't available, and HEURISTIC2 is possible, */ + /* return NULL so that HEURISTIC2 will be tried. Otherwise bail. */ +# ifdef HEURISTIC2 + return (ptr_t)NULL; +# else ABORT("Couldn't read /proc/self/stat"); +# endif } c = stat_buf[buf_offset++]; /* Skip the required number of fields. This number is hopefully */ @@ -983,7 +989,16 @@ c = stat_buf[buf_offset++]; } close(f); - if (result < 0x10000000) ABORT("Absurd stack bottom value"); + if (result < 0x10000000) { + /* if stack base result is silly (e.g. is 0 due to grsec), and */ + /* HEURISTIC2 is enabled, return NULL so that HEURISTIC2 will be */ + /* tried. Otherwise bail. */ +# ifdef HEURISTIC2 + return (ptr_t)NULL; +# else + ABORT("Absurd stack bottom value"); +# endif + } return (ptr_t)result; } @@ -1045,6 +1060,12 @@ result = GC_freebsd_stack_base(); # endif # ifdef HEURISTIC2 +/* if both LINUX_STACKBOTTOM and HEURISTIC2 are enabled, try HEURISTIC2 */ +/* when the LINUX_STACKBOTTOM returns NULL (indicating failure to get */ +/* a sensible result from /proc/self/stat) */ +# ifdef LINUX_STACKBOTTOM + if (result == (ptr_t)NULL) { +# endif # ifdef STACK_GROWS_DOWN result = GC_find_limit((ptr_t)(&dummy), TRUE); # ifdef HEURISTIC2_LIMIT @@ -1062,6 +1083,11 @@ } # endif # endif +/* tail of extra 'if' condition when both LINUX_STACKBOTTOM and */ +/* HEURISTIC are configured. */ +# ifdef LINUX_STACKBOTTOM + } +# endif # endif /* HEURISTIC2 */ # ifdef STACK_GROWS_DOWN