fix overflow bugs in parser and scanner: check if we have space

before we start writing!


git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@658 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2002-10-29 03:10:00 +00:00
parent 8d9d9cb4d5
commit 36a9f180c3
4 changed files with 19 additions and 12 deletions

View File

@ -716,7 +716,7 @@ growstack(long size)
gc_verbose = is_gc_verbose(); gc_verbose = is_gc_verbose();
stack_overflows++; stack_overflows++;
if (gc_verbose) { if (gc_verbose) {
YP_fprintf(YP_stderr, "[SO] Stack overflow %d\n", stack_overflows); YP_fprintf(YP_stderr, "[SO] Stack Overflow %d\n", stack_overflows);
YP_fprintf(YP_stderr, "[SO] Heap: %8ld cells (%p-%p)\n", (unsigned long int)(H-(CELL *)GlobalBase),GlobalBase,H); YP_fprintf(YP_stderr, "[SO] Heap: %8ld cells (%p-%p)\n", (unsigned long int)(H-(CELL *)GlobalBase),GlobalBase,H);
YP_fprintf(YP_stderr, "[SO] Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP); YP_fprintf(YP_stderr, "[SO] Local:%8ld cells (%p-%p)\n", (unsigned long int)(LCL0-ASP),LCL0,ASP);
YP_fprintf(YP_stderr, "[SO] Trail:%8ld cells (%p-%p)\n", YP_fprintf(YP_stderr, "[SO] Trail:%8ld cells (%p-%p)\n",
@ -771,7 +771,7 @@ AdjustScannerStacks(TokEntry **tksp, VarEntry **vep)
VarEntry *ves = *vep; VarEntry *ves = *vep;
if (tks != NULL) { if (tks != NULL) {
tks = *tksp = (TokEntry *)TrailAddrAdjust((ADDR)tks); tks = *tksp = TokEntryAdjust(tks);
} }
while (tks != NULL) { while (tks != NULL) {
TokEntry *tktmp; TokEntry *tktmp;
@ -789,7 +789,7 @@ AdjustScannerStacks(TokEntry **tksp, VarEntry **vep)
} }
tktmp = tks->TokNext; tktmp = tks->TokNext;
if (tktmp != NULL) { if (tktmp != NULL) {
tktmp = (TokEntry *)TrailAddrAdjust((ADDR)tktmp); tktmp = TokEntryAdjust(tktmp);
tks->TokNext = tktmp; tks->TokNext = tktmp;
} }
tks = tktmp; tks = tktmp;
@ -800,12 +800,12 @@ AdjustScannerStacks(TokEntry **tksp, VarEntry **vep)
} }
ves = AnonVarTable; ves = AnonVarTable;
if (ves != NULL) { if (ves != NULL) {
ves = AnonVarTable = (VarEntry *)TrailAddrAdjust((ADDR)ves); ves = AnonVarTable = VarEntryAdjust(ves);
} }
while (ves != NULL) { while (ves != NULL) {
VarEntry *vetmp = ves->VarLeft; VarEntry *vetmp = ves->VarLeft;
if (vetmp != NULL) { if (vetmp != NULL) {
vetmp = (VarEntry *)TrailAddrAdjust((ADDR)vetmp); vetmp = VarEntryAdjust(vetmp);
ves->VarLeft = vetmp; ves->VarLeft = vetmp;
} }
ves->VarAdr = TermNil; ves->VarAdr = TermNil;
@ -853,8 +853,10 @@ growstack_in_parser(tr_fr_ptr *old_trp, TokEntry **tksp, VarEntry **vep)
MoveLocalAndTrail(); MoveLocalAndTrail();
AdjustScannerStacks(tksp, vep); AdjustScannerStacks(tksp, vep);
{ {
tr_fr_ptr nTR = TR; tr_fr_ptr nTR;
*old_trp = TR = PtoTRAdjust(*old_trp); nTR = TR = PtoTRAdjust(TR);
*old_trp = PtoTRAdjust(*old_trp);
TR = *old_trp;
AdjustGrowStack(); AdjustGrowStack();
TR = nTR; TR = nTR;
} }

View File

@ -2841,7 +2841,7 @@ p_read (void)
#if EMACS #if EMACS
int emacs_cares = FALSE; int emacs_cares = FALSE;
#endif #endif
tr_fr_ptr old_TR; tr_fr_ptr old_TR, TR_before_parse;
if (Stream[c_input_stream].status & Binary_Stream_f) { if (Stream[c_input_stream].status & Binary_Stream_f) {
Error(PERMISSION_ERROR_INPUT_BINARY_STREAM, MkAtomTerm(Stream[c_input_stream].u.file.name), "read_term/2"); Error(PERMISSION_ERROR_INPUT_BINARY_STREAM, MkAtomTerm(Stream[c_input_stream].u.file.name), "read_term/2");
@ -2883,9 +2883,11 @@ p_read (void)
} }
} }
repeat_cycle: repeat_cycle:
TR_before_parse = TR;
if (ErrorMessage || (t = Parse ()) == 0) { if (ErrorMessage || (t = Parse ()) == 0) {
if (ErrorMessage && (strcmp(ErrorMessage,"Stack Overflow") == 0)) { if (ErrorMessage && (strcmp(ErrorMessage,"Stack Overflow") == 0)) {
/* ignore term we just built */ /* ignore term we just built */
TR = TR_before_parse;
H = old_H; H = old_H;
if (growstack_in_parser(&old_TR, &tokstart, &VarTable)) { if (growstack_in_parser(&old_TR, &tokstart, &VarTable)) {
old_H = H; old_H = H;
@ -2900,6 +2902,7 @@ p_read (void)
return(FALSE); return(FALSE);
} else if (ParserErrorStyle == CONTINUE_ON_PARSER_ERROR) { } else if (ParserErrorStyle == CONTINUE_ON_PARSER_ERROR) {
ErrorMessage = NULL; ErrorMessage = NULL;
TR = TR_before_parse;
/* try again */ /* try again */
goto repeat_cycle; goto repeat_cycle;
} else { } else {

View File

@ -295,6 +295,10 @@ ParseArgs(Atom a)
* Needed because the arguments for the functor are placed in reverse * Needed because the arguments for the functor are placed in reverse
* order * order
*/ */
if (H > ASP-(nargs+1)) {
ErrorMessage = "Stack Overflow";
FAIL;
}
#ifdef SFUNC #ifdef SFUNC
if (pe) if (pe)
t = MkSFTerm(MkFunctor(a, SFArity), nargs, p, pe->NilValue); t = MkSFTerm(MkFunctor(a, SFArity), nargs, p, pe->NilValue);
@ -304,10 +308,6 @@ ParseArgs(Atom a)
t = MkApplTerm(MkFunctor(a, nargs), nargs, p); t = MkApplTerm(MkFunctor(a, nargs), nargs, p);
#endif #endif
/* check for possible overflow against local stack */ /* check for possible overflow against local stack */
if (H > ASP-4096) {
ErrorMessage = "Stack Overflow";
FAIL;
}
checkfor((Term) ')'); checkfor((Term) ')');
return (t); return (t);
} }

View File

@ -55,6 +55,8 @@ Inline(LocalAdjust, CELL, CELL, val, (val+LDiff) )
Inline(LocalAddrAdjust, ADDR, ADDR, ptr, (ptr+LDiff) ) Inline(LocalAddrAdjust, ADDR, ADDR, ptr, (ptr+LDiff) )
Inline(TrailAdjust, CELL, CELL, val, (val+TrDiff) ) Inline(TrailAdjust, CELL, CELL, val, (val+TrDiff) )
Inline(TrailAddrAdjust, ADDR, ADDR, ptr, (ptr+TrDiff) ) Inline(TrailAddrAdjust, ADDR, ADDR, ptr, (ptr+TrDiff) )
Inline(TokEntryAdjust, TokEntry *, TokEntry*, ptr, ((CELL)ptr+TrDiff) )
Inline(VarEntryAdjust, VarEntry *, VarEntry*, ptr, ((CELL)ptr+TrDiff) )
/* heap data structures */ /* heap data structures */
Inline(FuncAdjust, Functor, Functor, f, (Functor)(CharP(f)+HDiff) ) Inline(FuncAdjust, Functor, Functor, f, (Functor)(CharP(f)+HDiff) )
Inline(CellPtoHeapAdjust, CELL *, CELL *, ptr, ((CELL *)(CharP(ptr) + HDiff)) ) Inline(CellPtoHeapAdjust, CELL *, CELL *, ptr, ((CELL *)(CharP(ptr) + HDiff)) )