Check for stack overflow in paflof engine

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@redhat.com>
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
This commit is contained in:
Thomas Huth 2015-11-25 20:58:15 +01:00 committed by Alexey Kardashevskiy
parent b3804299da
commit 3d5e62eea2
2 changed files with 10 additions and 1 deletions

View File

@ -215,5 +215,5 @@ C_ENTRY(call_c)
mtctr r6
bctr
.global the_system_stack
.lcomm the_system_stack, STACKSIZE, 16

View File

@ -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;
}