You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/dev-libs/boehm-gc/files/boehm-gc-6.5-gentoo.patch

84 lines
2.7 KiB

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