[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