[SLOF] [PATCH 1/5] Check for stack overflow in paflof engine

Thomas Huth thuth at redhat.com
Thu Nov 26 06:58:15 AEDT 2015


Since engine() can be called recursively, this function is
prone for causing stack overflows. Add a sanity check and
spill out an error message if we detect an overflow. It's
not a bullet-proof check, but still, it should catch at least
the larger overflows and thus hopefully help detecting and
debugging these overflow problems in the future.

Signed-off-by: Thomas Huth <thuth at redhat.com>
---
 slof/entry.S  | 2 +-
 slof/paflof.c | 9 +++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/slof/entry.S b/slof/entry.S
index d3d29f8..5372de3 100644
--- a/slof/entry.S
+++ b/slof/entry.S
@@ -215,5 +215,5 @@ C_ENTRY(call_c)
 	mtctr	r6
 	bctr
 
-
+.global the_system_stack
 	.lcomm	the_system_stack, STACKSIZE, 16
diff --git a/slof/paflof.c b/slof/paflof.c
index 624955f..2fc25c8 100644
--- a/slof/paflof.c
+++ b/slof/paflof.c
@@ -19,6 +19,7 @@
 #undef unix
 
 #include "paflof.h"
+#include <stdio.h>
 #include <string.h>
 #include <stdint.h>
 #include <ctype.h>
@@ -43,6 +44,9 @@ unsigned char hash_table[HASHSIZE*CELLSIZE];
 
 #include ISTR(TARG,c)
 
+static int did_stackwarning;
+extern char the_system_stack[];
+
 // the actual engine
 long engine(int mode, long param_1, long param_2)
 {
@@ -84,6 +88,11 @@ long engine(int mode, long param_1, long param_2)
 		c_return[1].a = &dummy;
 	}
 
+	if ((char *)&ip < the_system_stack && !did_stackwarning) {
+		puts("ERROR: stack overflow in engine()!");
+		did_stackwarning = 1;
+	}
+
 	if (mode & ENGINE_MODE_PARAM_2) {
 		(++dp)->n = param_2;
 	}
-- 
1.8.3.1



More information about the SLOF mailing list