handle code space overflows while parsing.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1868 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc
2007-04-18 06:30:41 +00:00
parent b6b308649c
commit ee03654060
7 changed files with 167 additions and 95 deletions

View File

@@ -310,6 +310,7 @@ ParseArgs(Atom a, JMPBUFF *FailBuff)
{
int nargs = 0;
Term *p, t;
Functor func;
#ifdef SFUNC
SFEntry *pe = (SFEntry *) Yap_GetAProp(a, SFProperty);
#endif
@@ -340,6 +341,11 @@ ParseArgs(Atom a, JMPBUFF *FailBuff)
Yap_ErrorMessage = "Stack Overflow";
FAIL;
}
func = Yap_MkFunctor(a, nargs);
if (func == NULL) {
Yap_ErrorMessage = "Heap Overflow";
FAIL;
}
#ifdef SFUNC
if (pe)
t = MkSFTerm(Yap_MkFunctor(a, SFArity), nargs, p, pe->NilValue);
@@ -349,7 +355,7 @@ ParseArgs(Atom a, JMPBUFF *FailBuff)
if (a == AtomDBRef && nargs == 2)
t = MkDBRefTerm((DBRef)IntegerOfTerm(p[0]));
else
t = Yap_MkApplTerm(Yap_MkFunctor(a, nargs), nargs, p);
t = Yap_MkApplTerm(func, nargs, p);
#endif
if (H > ASP-4096) {
Yap_ErrorMessage = "Stack Overflow";
@@ -485,6 +491,10 @@ ParseTerm(int prio, JMPBUFF *FailBuff)
TRY(
/* build appl on the heap */
func = Yap_MkFunctor((Atom) t, 1);
if (func == NULL) {
Yap_ErrorMessage = "Heap Overflow";
FAIL;
}
t = ParseTerm(oprprio, FailBuff);
t = Yap_MkApplTerm(func, 1, &t);
/* check for possible overflow against local stack */
@@ -517,9 +527,14 @@ ParseTerm(int prio, JMPBUFF *FailBuff)
t = MkAtomTerm(AtomNil);
else if (yap_flags[YAP_DOUBLE_QUOTES_FLAG] == STRING_AS_CHARS)
t = Yap_StringToListOfAtoms(p);
else if (yap_flags[YAP_DOUBLE_QUOTES_FLAG] == STRING_AS_ATOM)
t = MkAtomTerm(Yap_LookupAtom(p));
else
else if (yap_flags[YAP_DOUBLE_QUOTES_FLAG] == STRING_AS_ATOM) {
Atom at = Yap_LookupAtom(p);
if (at == NIL) {
Yap_ErrorMessage = "Heap Overflow";
FAIL;
}
t = MkAtomTerm(at);
} else
t = Yap_StringToList(p);
NextToken;
}
@@ -602,6 +617,10 @@ ParseTerm(int prio, JMPBUFF *FailBuff)
Volatile int oldprio = curprio;
TRY3(
func = Yap_MkFunctor((Atom) Yap_tokptr->TokInfo, 2);
if (func == NULL) {
Yap_ErrorMessage = "Heap Overflow";
FAIL;
}
NextToken;
{
Term args[2];
@@ -625,7 +644,12 @@ ParseTerm(int prio, JMPBUFF *FailBuff)
if (IsPosfixOp(opinfo, &opprio, &oplprio)
&& opprio <= prio && oplprio >= curprio) {
/* parse as posfix operator */
t = Yap_MkApplTerm(Yap_MkFunctor((Atom) Yap_tokptr->TokInfo, 1), 1, &t);
Functor fun = Yap_MkFunctor((Atom) Yap_tokptr->TokInfo, 1);
if (func == NULL) {
Yap_ErrorMessage = "Heap Overflow";
FAIL;
}
t = Yap_MkApplTerm(func, 1, &t);
/* check for possible overflow against local stack */
if (H > ASP-4096) {
Yap_ErrorMessage = "Stack Overflow";