summaryrefslogtreecommitdiff
blob: 72eb881eef7dc43df6ed8f83414d0b01ae780202 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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