check for overflows.

check PL_unify_list
This commit is contained in:
Vítor Santos Costa 2010-05-04 15:03:12 +01:00
parent df244be341
commit 0e88668df8

View File

@ -195,12 +195,29 @@ UserCPredicate(char *a, CPredicate def, unsigned long int arity, Term mod, int f
{ {
PredEntry *pe; PredEntry *pe;
Term cm = CurrentModule; Term cm = CurrentModule;
/* fprintf(stderr,"doing %s:%s/%d\n", RepAtom(AtomOfTerm(mod))->StrOfAE, a,arity); */
CurrentModule = mod; CurrentModule = mod;
Yap_InitCPred(a, arity, def, UserCPredFlag); Yap_InitCPred(a, arity, def, UserCPredFlag);
if (arity == 0) { if (arity == 0) {
pe = RepPredProp(PredPropByAtom(Yap_LookupAtom(a),mod)); Atom at;
while ((at = Yap_LookupAtom(a)) == NULL) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return;
}
}
pe = RepPredProp(PredPropByAtom(at,mod));
} else { } else {
Functor f = Yap_MkFunctor(Yap_LookupAtom(a), arity); Atom at;
Functor f;
while ((at = Yap_LookupAtom(a)) == NULL) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return;
}
}
f = Yap_MkFunctor(at, arity);
pe = RepPredProp(PredPropByFunc(f,mod)); pe = RepPredProp(PredPropByFunc(f,mod));
} }
pe->PredFlags |= (CArgsPredFlag|flags); pe->PredFlags |= (CArgsPredFlag|flags);
@ -498,7 +515,8 @@ X_API int PL_get_nchars(term_t l, size_t *len, char **sp, unsigned flags)
{ {
int out = PL_get_chars(l, sp, flags); int out = PL_get_chars(l, sp, flags);
if (!out) return out; if (!out) return out;
*len = strlen(*sp); if (len)
*len = strlen(*sp);
return out; return out;
} }
@ -818,7 +836,13 @@ X_API int PL_get_tail(term_t ts, term_t tl)
*/ */
X_API atom_t PL_new_atom(const char *c) X_API atom_t PL_new_atom(const char *c)
{ {
Atom at = Yap_LookupAtom((char *)c); Atom at;
while ((at = Yap_LookupAtom((char *)c)) == NULL) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return 0L;
}
}
Yap_AtomIncreaseHold(at); Yap_AtomIncreaseHold(at);
return AtomToSWIAtom(at); return AtomToSWIAtom(at);
} }
@ -832,18 +856,45 @@ X_API atom_t PL_new_atom_wchars(int len, const wchar_t *c)
if (c[i] > 255) break; if (c[i] > 255) break;
} }
if (i!=len) { if (i!=len) {
wchar_t *nbf = (wchar_t *)YAP_AllocSpaceFromYap((len+1)*sizeof(wchar_t)); Atom at0;
wchar_t *nbf;
while (!(nbf = (wchar_t *)YAP_AllocSpaceFromYap((len+1)*sizeof(wchar_t)))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return 0;
}
}
for (i=0;i<len;i++) for (i=0;i<len;i++)
nbf[i] = c[i]; nbf[i] = c[i];
nbf[len]='\0'; nbf[len]='\0';
at = AtomToSWIAtom(Yap_LookupMaybeWideAtom(nbf)); while ((at0 = Yap_LookupWideAtom(nbf)) == NULL) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return 0L;
}
}
at = AtomToSWIAtom(at0);
YAP_FreeSpaceFromYap(nbf); YAP_FreeSpaceFromYap(nbf);
} else { } else {
char *nbf = (char *)YAP_AllocSpaceFromYap((len+1)*sizeof(char)); char *nbf;
Atom at0;
while (!(nbf = (char *)YAP_AllocSpaceFromYap((len+1)*sizeof(char)))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return 0;
}
}
for (i=0;i<len;i++) for (i=0;i<len;i++)
nbf[i] = c[i]; nbf[i] = c[i];
nbf[len]='\0'; nbf[len]='\0';
at = AtomToSWIAtom(Yap_LookupAtom(nbf)); while (!(at0 = Yap_LookupAtom(nbf))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return 0;
}
}
at = AtomToSWIAtom(at0);
YAP_FreeSpaceFromYap(nbf); YAP_FreeSpaceFromYap(nbf);
} }
return at; return at;
@ -930,9 +981,14 @@ X_API int PL_cons_functor(term_t d, functor_t f,...)
} }
va_end (ap); va_end (ap);
if (arity == 2 && ff == FunctorDot) if (arity == 2 && ff == FunctorDot)
Yap_PutInSlot(d,YAP_MkPairTerm(tmp[0],tmp[1])); Yap_PutInSlot(d,MkPairTerm(tmp[0],tmp[1]));
else else
Yap_PutInSlot(d,YAP_MkApplTerm((YAP_Functor)ff,arity,tmp)); Yap_PutInSlot(d,Yap_MkApplTerm(ff,arity,tmp));
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
return TRUE; return TRUE;
} }
@ -947,9 +1003,14 @@ X_API int PL_cons_functor_v(term_t d, functor_t f,term_t a0)
} }
arity = ArityOfFunctor(ff); arity = ArityOfFunctor(ff);
if (arity == 2 && ff == FunctorDot) if (arity == 2 && ff == FunctorDot)
Yap_PutInSlot(d,YAP_MkPairTerm(Yap_GetFromSlot(a0),Yap_GetFromSlot(a0+1))); Yap_PutInSlot(d,MkPairTerm(Yap_GetFromSlot(a0),Yap_GetFromSlot(a0+1)));
else else
Yap_PutInSlot(d,YAP_MkApplTerm((YAP_Functor)ff,arity,YAP_AddressFromSlot(a0))); Yap_PutInSlot(d,Yap_MkApplTerm(ff,arity,Yap_AddressFromSlot(a0)));
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
return TRUE; return TRUE;
} }
@ -967,7 +1028,14 @@ X_API int PL_put_atom(term_t t, atom_t a)
X_API int PL_put_atom_chars(term_t t, const char *s) X_API int PL_put_atom_chars(term_t t, const char *s)
{ {
Yap_PutInSlot(t,MkAtomTerm(Yap_LookupAtom((char *)s))); Atom at;
while (!(at = Yap_LookupAtom((char *)s))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return FALSE;
}
}
Yap_PutInSlot(t,MkAtomTerm(at));
return TRUE; return TRUE;
} }
@ -990,6 +1058,11 @@ X_API int PL_put_functor(term_t t, functor_t f)
Yap_PutInSlot(t,YAP_MkNewPairTerm()); Yap_PutInSlot(t,YAP_MkNewPairTerm());
else else
Yap_PutInSlot(t,YAP_MkNewApplTerm((YAP_Functor)ff,arity)); Yap_PutInSlot(t,YAP_MkNewApplTerm((YAP_Functor)ff,arity));
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
} }
return TRUE; return TRUE;
} }
@ -1024,12 +1097,22 @@ X_API int PL_put_int64(term_t t, int64_t n)
X_API int PL_put_list(term_t t) X_API int PL_put_list(term_t t)
{ {
Yap_PutInSlot(t,YAP_MkNewPairTerm()); Yap_PutInSlot(t,YAP_MkNewPairTerm());
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
return TRUE; return TRUE;
} }
X_API int PL_put_list_chars(term_t t, const char *s) X_API int PL_put_list_chars(term_t t, const char *s)
{ {
Yap_PutInSlot(t,YAP_BufferToString((char *)s)); Yap_PutInSlot(t,YAP_BufferToString((char *)s));
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
return TRUE; return TRUE;
} }
@ -1062,7 +1145,7 @@ X_API int PL_put_term(term_t d, term_t s)
X_API int PL_put_variable(term_t t) X_API int PL_put_variable(term_t t)
{ {
Yap_PutInSlot(t,YAP_MkVarTerm()); Yap_PutInSlot(t,MkVarTerm());
return TRUE; return TRUE;
} }
@ -1338,7 +1421,14 @@ X_API int PL_unify_atom(term_t t, atom_t at)
X_API int PL_unify_atom_chars(term_t t, const char *s) X_API int PL_unify_atom_chars(term_t t, const char *s)
{ {
Atom catom = Yap_LookupAtom((char *)s); Atom catom = Yap_LookupAtom((char *)s);
Term cterm = MkAtomTerm(catom); Term cterm;
while (!(catom = Yap_LookupAtom((char *)s))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return FALSE;
}
}
cterm = MkAtomTerm(catom);
return Yap_unify(Yap_GetFromSlot(t),cterm); return Yap_unify(Yap_GetFromSlot(t),cterm);
} }
@ -1354,7 +1444,12 @@ X_API int PL_unify_atom_nchars(term_t t, size_t len, const char *s)
return FALSE; return FALSE;
strncpy(buf, s, len); strncpy(buf, s, len);
buf[len] = '\0'; buf[len] = '\0';
catom = Yap_LookupAtom(buf); while (!(catom = Yap_LookupAtom(buf))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return FALSE;
}
}
free(buf); free(buf);
cterm = MkAtomTerm(catom); cterm = MkAtomTerm(catom);
return YAP_Unify(Yap_GetFromSlot(t),cterm); return YAP_Unify(Yap_GetFromSlot(t),cterm);
@ -1382,6 +1477,11 @@ X_API int PL_unify_functor(term_t t, functor_t f)
{ {
YAP_Term tt = Yap_GetFromSlot(t); YAP_Term tt = Yap_GetFromSlot(t);
Functor ff = SWIFunctorToFunctor(f); Functor ff = SWIFunctorToFunctor(f);
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
if (YAP_IsVarTerm(tt)) if (YAP_IsVarTerm(tt))
return YAP_Unify(tt, YAP_MkNewApplTerm((YAP_Functor)ff,YAP_ArityOfFunctor((YAP_Functor)f))); return YAP_Unify(tt, YAP_MkNewApplTerm((YAP_Functor)ff,YAP_ArityOfFunctor((YAP_Functor)f)));
if (YAP_IsPairTerm(tt)) if (YAP_IsPairTerm(tt))
@ -1419,7 +1519,13 @@ X_API int PL_unify_int64(term_t t, int64_t n)
YAP long int unify(YAP_Term* a, Term* b) */ YAP long int unify(YAP_Term* a, Term* b) */
X_API int PL_unify_list(term_t tt, term_t h, term_t tail) X_API int PL_unify_list(term_t tt, term_t h, term_t tail)
{ {
Term t = Deref(Yap_GetFromSlot(tt)); Term t;
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
t = Deref(Yap_GetFromSlot(tt));
if (IsVarTerm(t)) { if (IsVarTerm(t)) {
Term pairterm = Yap_MkNewPairTerm(); Term pairterm = Yap_MkNewPairTerm();
Yap_unify(t, pairterm); Yap_unify(t, pairterm);
@ -1464,7 +1570,13 @@ X_API int PL_unify_arg(int index, term_t tt, term_t arg)
YAP long int unify(YAP_Term* a, Term* b) */ YAP long int unify(YAP_Term* a, Term* b) */
X_API int PL_unify_list_chars(term_t t, const char *chars) X_API int PL_unify_list_chars(term_t t, const char *chars)
{ {
YAP_Term chterm = YAP_BufferToString((char *)chars); YAP_Term chterm;
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
chterm = YAP_BufferToString((char *)chars);
return YAP_Unify(Yap_GetFromSlot(t), chterm); return YAP_Unify(Yap_GetFromSlot(t), chterm);
} }
@ -1489,7 +1601,13 @@ X_API int PL_unify_pointer(term_t t, void *ptr)
YAP long int unify(YAP_Term* a, Term* b) */ YAP long int unify(YAP_Term* a, Term* b) */
X_API int PL_unify_string_chars(term_t t, const char *chars) X_API int PL_unify_string_chars(term_t t, const char *chars)
{ {
YAP_Term chterm = YAP_BufferToString((char *)chars); YAP_Term chterm;
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
chterm = YAP_BufferToString((char *)chars);
return YAP_Unify(Yap_GetFromSlot(t), chterm); return YAP_Unify(Yap_GetFromSlot(t), chterm);
} }
@ -1502,9 +1620,23 @@ X_API int PL_unify_wchars(term_t t, int type, size_t len, const pl_wchar_t *char
if (len == (size_t)-1) if (len == (size_t)-1)
len = wcslen(chars); len = wcslen(chars);
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
switch (type) { switch (type) {
case PL_ATOM: case PL_ATOM:
chterm = MkAtomTerm(Yap_LookupMaybeWideAtom((wchar_t *)chars)); {
Atom at;
while ((at = Yap_LookupMaybeWideAtom((wchar_t *)chars)) == NULL) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return FALSE;
}
}
chterm = MkAtomTerm(at);
}
break; break;
case PL_STRING: case PL_STRING:
case PL_CODE_LIST: case PL_CODE_LIST:
@ -1526,6 +1658,11 @@ X_API int PL_unify_wchars_diff(term_t t, term_t tail, int type, size_t len, cons
{ {
YAP_Term chterm; YAP_Term chterm;
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
if (len == (size_t)-1) if (len == (size_t)-1)
len = wcslen(chars); len = wcslen(chars);
@ -1578,6 +1715,12 @@ LookupMaxAtom(size_t n, char *s)
strncpy(buf, s, n); strncpy(buf, s, n);
buf[n] = '\0'; buf[n] = '\0';
catom = Yap_LookupAtom(buf); catom = Yap_LookupAtom(buf);
while (!(catom = Yap_LookupAtom(buf))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return NULL;
}
}
Yap_FreeCodeSpace(buf); Yap_FreeCodeSpace(buf);
return catom; return catom;
} }
@ -1592,7 +1735,12 @@ LookupMaxWideAtom(size_t n, wchar_t *s)
return FALSE; return FALSE;
wcsncpy(buf, s, n); wcsncpy(buf, s, n);
buf[n] = '\0'; buf[n] = '\0';
catom = Yap_LookupMaybeWideAtom(buf); while (!(catom = Yap_LookupMaybeWideAtom(buf))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return NULL;
}
}
Yap_FreeAtomSpace((ADDR)buf); Yap_FreeAtomSpace((ADDR)buf);
return catom; return catom;
} }
@ -1625,6 +1773,11 @@ X_API int PL_unify_term(term_t l,...)
stack_el stack[MAX_DEPTH]; stack_el stack[MAX_DEPTH];
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
va_start (ap, l); va_start (ap, l);
pt = a; pt = a;
while (depth > 0) { while (depth > 0) {
@ -1657,7 +1810,16 @@ X_API int PL_unify_term(term_t l,...)
*pt++ = YAP_BufferToString(va_arg(ap, char *)); *pt++ = YAP_BufferToString(va_arg(ap, char *));
break; break;
case PL_CHARS: case PL_CHARS:
*pt++ = MkAtomTerm(Yap_LookupAtom(va_arg(ap, char *))); {
Atom at;
while (!(at = Yap_LookupAtom(va_arg(ap, char *)))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return FALSE;
}
}
*pt++ = MkAtomTerm(at);
}
break; break;
case PL_NCHARS: case PL_NCHARS:
{ {
@ -1742,11 +1904,28 @@ X_API int PL_unify_term(term_t l,...)
size_t arity = va_arg(ap, size_t); size_t arity = va_arg(ap, size_t);
if (!arity) { if (!arity) {
*pt++ = MkAtomTerm(Yap_LookupAtom(fname)); Atom at;
} else {
Functor ff = Yap_MkFunctor(Yap_LookupAtom(fname),arity);
Term t = Yap_MkNewApplTerm(ff, arity);
while (!(at = Yap_LookupAtom(fname))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return FALSE;
}
}
*pt++ = MkAtomTerm(at);
} else {
Atom at;
Functor ff;
Term t;
while (!(at = Yap_LookupAtom(fname))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return FALSE;
}
}
ff = Yap_MkFunctor(at,arity);
t = Yap_MkNewApplTerm(ff, arity);
if (nels) { if (nels) {
if (depth == MAX_DEPTH) { if (depth == MAX_DEPTH) {
fprintf(stderr,"very deep term in PL_unify_term\n"); fprintf(stderr,"very deep term in PL_unify_term\n");
@ -2120,15 +2299,27 @@ X_API predicate_t PL_pred(functor_t f, module_t m)
X_API predicate_t PL_predicate(const char *name, int arity, const char *m) X_API predicate_t PL_predicate(const char *name, int arity, const char *m)
{ {
Term mod; Term mod;
Atom at;
if (m == NULL) { if (m == NULL) {
mod = CurrentModule; mod = CurrentModule;
if (!mod) mod = USER_MODULE; if (!mod) mod = USER_MODULE;
} else { } else {
mod = MkAtomTerm(Yap_LookupAtom((char *)m)); Atom at;
while (!(at = Yap_LookupAtom((char *)m))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return NULL;
}
}
mod = MkAtomTerm(at);
} }
return YAP_Predicate(YAP_LookupAtom((char *)name), while (!(at = Yap_LookupAtom((char *)name))) {
arity, if (!Yap_growheap(FALSE, 0L, NULL)) {
mod); Yap_Error(OUT_OF_HEAP_ERROR, TermNil, Yap_ErrorMessage);
return NULL;
}
}
return YAP_Predicate((YAP_Atom)at, arity, mod);
} }
X_API void PL_predicate_info(predicate_t p,atom_t *name, int *arity, module_t *m) X_API void PL_predicate_info(predicate_t p,atom_t *name, int *arity, module_t *m)
@ -2188,6 +2379,7 @@ X_API int PL_next_solution(qid_t qi)
if (qi->open != 1) return 0; if (qi->open != 1) return 0;
if (qi->state == 0) { if (qi->state == 0) {
result = YAP_RunGoal(qi->g); result = YAP_RunGoal(qi->g);
} else { } else {
result = YAP_RestartGoal(); result = YAP_RestartGoal();