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;
Term cm = CurrentModule;
/* fprintf(stderr,"doing %s:%s/%d\n", RepAtom(AtomOfTerm(mod))->StrOfAE, a,arity); */
CurrentModule = mod;
Yap_InitCPred(a, arity, def, UserCPredFlag);
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 {
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->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);
if (!out) return out;
*len = strlen(*sp);
if (len)
*len = strlen(*sp);
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)
{
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);
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 (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++)
nbf[i] = c[i];
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);
} 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++)
nbf[i] = c[i];
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);
}
return at;
@ -930,9 +981,14 @@ X_API int PL_cons_functor(term_t d, functor_t f,...)
}
va_end (ap);
if (arity == 2 && ff == FunctorDot)
Yap_PutInSlot(d,YAP_MkPairTerm(tmp[0],tmp[1]));
Yap_PutInSlot(d,MkPairTerm(tmp[0],tmp[1]));
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;
}
@ -947,9 +1003,14 @@ X_API int PL_cons_functor_v(term_t d, functor_t f,term_t a0)
}
arity = ArityOfFunctor(ff);
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
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;
}
@ -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)
{
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;
}
@ -990,6 +1058,11 @@ X_API int PL_put_functor(term_t t, functor_t f)
Yap_PutInSlot(t,YAP_MkNewPairTerm());
else
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;
}
@ -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)
{
Yap_PutInSlot(t,YAP_MkNewPairTerm());
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
return TRUE;
}
X_API int PL_put_list_chars(term_t t, const 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;
}
@ -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)
{
Yap_PutInSlot(t,YAP_MkVarTerm());
Yap_PutInSlot(t,MkVarTerm());
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)
{
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);
}
@ -1354,7 +1444,12 @@ X_API int PL_unify_atom_nchars(term_t t, size_t len, const char *s)
return FALSE;
strncpy(buf, s, len);
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);
cterm = MkAtomTerm(catom);
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);
Functor ff = SWIFunctorToFunctor(f);
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
if (YAP_IsVarTerm(tt))
return YAP_Unify(tt, YAP_MkNewApplTerm((YAP_Functor)ff,YAP_ArityOfFunctor((YAP_Functor)f)));
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) */
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)) {
Term pairterm = Yap_MkNewPairTerm();
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) */
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);
}
@ -1489,7 +1601,13 @@ X_API int PL_unify_pointer(term_t t, void *ptr)
YAP long int unify(YAP_Term* a, Term* b) */
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);
}
@ -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)
len = wcslen(chars);
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
switch (type) {
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;
case PL_STRING:
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;
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
if (len == (size_t)-1)
len = wcslen(chars);
@ -1578,6 +1715,12 @@ LookupMaxAtom(size_t n, char *s)
strncpy(buf, s, n);
buf[n] = '\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 NULL;
}
}
Yap_FreeCodeSpace(buf);
return catom;
}
@ -1592,7 +1735,12 @@ LookupMaxWideAtom(size_t n, wchar_t *s)
return FALSE;
wcsncpy(buf, s, n);
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);
return catom;
}
@ -1625,6 +1773,11 @@ X_API int PL_unify_term(term_t l,...)
stack_el stack[MAX_DEPTH];
if (Unsigned(H) > Unsigned(ASP)-CreepFlag) {
if (!Yap_gc(0, ENV, CP)) {
return FALSE;
}
}
va_start (ap, l);
pt = a;
while (depth > 0) {
@ -1657,7 +1810,16 @@ X_API int PL_unify_term(term_t l,...)
*pt++ = YAP_BufferToString(va_arg(ap, char *));
break;
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;
case PL_NCHARS:
{
@ -1742,11 +1904,28 @@ X_API int PL_unify_term(term_t l,...)
size_t arity = va_arg(ap, size_t);
if (!arity) {
*pt++ = MkAtomTerm(Yap_LookupAtom(fname));
} else {
Functor ff = Yap_MkFunctor(Yap_LookupAtom(fname),arity);
Term t = Yap_MkNewApplTerm(ff, arity);
Atom at;
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 (depth == MAX_DEPTH) {
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)
{
Term mod;
Atom at;
if (m == NULL) {
mod = CurrentModule;
if (!mod) mod = USER_MODULE;
} 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),
arity,
mod);
while (!(at = Yap_LookupAtom((char *)name))) {
if (!Yap_growheap(FALSE, 0L, NULL)) {
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)
@ -2188,6 +2379,7 @@ X_API int PL_next_solution(qid_t qi)
if (qi->open != 1) return 0;
if (qi->state == 0) {
result = YAP_RunGoal(qi->g);
} else {
result = YAP_RestartGoal();