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:
parent
b3804299da
commit
3d5e62eea2
|
@ -215,5 +215,5 @@ C_ENTRY(call_c)
|
|||
mtctr r6
|
||||
bctr
|
||||
|
||||
|
||||
.global the_system_stack
|
||||
.lcomm the_system_stack, STACKSIZE, 16
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue