memory leaks
This commit is contained in:
parent
4ac6d11dca
commit
71c49f5063
17
os/iopreds.c
17
os/iopreds.c
@ -1276,9 +1276,8 @@ do_open(Term file_name, Term t2,
|
|||||||
if ((fd = fopen(fname, io_mode)) == NULL ||
|
if ((fd = fopen(fname, io_mode)) == NULL ||
|
||||||
(!(flags & Binary_Stream_f) && binary_file(fname))) {
|
(!(flags & Binary_Stream_f) && binary_file(fname))) {
|
||||||
strncpy(LOCAL_FileNameBuf, fname, MAXPATHLEN);
|
strncpy(LOCAL_FileNameBuf, fname, MAXPATHLEN);
|
||||||
if (fname != fbuf && fname != LOCAL_FileNameBuf &&
|
if (fname != fbuf)
|
||||||
fname != LOCAL_FileNameBuf2)
|
freeBuffer((void *)fname);
|
||||||
free((void *)fname);
|
|
||||||
fname = LOCAL_FileNameBuf;
|
fname = LOCAL_FileNameBuf;
|
||||||
UNLOCK(st->streamlock);
|
UNLOCK(st->streamlock);
|
||||||
if (errno == ENOENT) {
|
if (errno == ENOENT) {
|
||||||
@ -1314,6 +1313,8 @@ do_open(Term file_name, Term t2,
|
|||||||
Yap_DefaultStreamOps(st);
|
Yap_DefaultStreamOps(st);
|
||||||
if (script)
|
if (script)
|
||||||
open_header(sno, open_mode);
|
open_header(sno, open_mode);
|
||||||
|
if (fname != fbuf)
|
||||||
|
freeBuffer(fname);
|
||||||
|
|
||||||
free(args);
|
free(args);
|
||||||
UNLOCK(st->streamlock);
|
UNLOCK(st->streamlock);
|
||||||
@ -1437,7 +1438,8 @@ static Int p_file_expansion(USES_REGS1) { /* '$file_expansion'(+File,-Name) */
|
|||||||
PlIOError(INSTANTIATION_ERROR, file_name, "absolute_file_name/3");
|
PlIOError(INSTANTIATION_ERROR, file_name, "absolute_file_name/3");
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
if (!Yap_findFile(RepAtom(AtomOfTerm(file_name))->StrOfAE, NULL, NULL, LOCAL_FileNameBuf, true, YAP_ANY_FILE, true, false))
|
if (!Yap_findFile(RepAtom(AtomOfTerm(file_name))->StrOfAE, NULL, NULL,
|
||||||
|
LOCAL_FileNameBuf, true, YAP_ANY_FILE, true, false))
|
||||||
return (PlIOError(EXISTENCE_ERROR_SOURCE_SINK, file_name,
|
return (PlIOError(EXISTENCE_ERROR_SOURCE_SINK, file_name,
|
||||||
"absolute_file_name/3"));
|
"absolute_file_name/3"));
|
||||||
return (Yap_unify(ARG2, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))));
|
return (Yap_unify(ARG2, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))));
|
||||||
@ -1589,11 +1591,9 @@ int Yap_CheckBinaryStream__(const char *file, const char *f, int line, Term arg,
|
|||||||
if ((GLOBAL_Stream[sno].status & Binary_Stream_f)) {
|
if ((GLOBAL_Stream[sno].status & Binary_Stream_f)) {
|
||||||
UNLOCK(GLOBAL_Stream[sno].streamlock);
|
UNLOCK(GLOBAL_Stream[sno].streamlock);
|
||||||
if (kind == Input_Stream_f)
|
if (kind == Input_Stream_f)
|
||||||
PlIOError__(file, f, line, PERMISSION_ERROR_INPUT_TEXT_STREAM, arg,
|
PlIOError__(file, f, line, PERMISSION_ERROR_INPUT_TEXT_STREAM, arg, msg);
|
||||||
msg);
|
|
||||||
else
|
else
|
||||||
PlIOError__(file, f, line, PERMISSION_ERROR_OUTPUT_TEXT_STREAM, arg,
|
PlIOError__(file, f, line, PERMISSION_ERROR_OUTPUT_TEXT_STREAM, arg, msg);
|
||||||
msg);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return sno;
|
return sno;
|
||||||
@ -1822,7 +1822,6 @@ static Int get_abs_file_parameter(USES_REGS1) {
|
|||||||
Yap_Error(DOMAIN_ERROR_ABSOLUTE_FILE_NAME_OPTION, ARG1, NULL);
|
Yap_Error(DOMAIN_ERROR_ABSOLUTE_FILE_NAME_OPTION, ARG1, NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Yap_InitPlIO(void) {
|
void Yap_InitPlIO(void) {
|
||||||
Int i;
|
Int i;
|
||||||
|
|
||||||
|
@ -458,4 +458,11 @@ char *Yap_MemExportStreamPtr(int sno);
|
|||||||
|
|
||||||
bool Yap_Exists(const char *f);
|
bool Yap_Exists(const char *f);
|
||||||
|
|
||||||
|
static inline void freeBuffer(const void *ptr) {
|
||||||
|
CACHE_REGS
|
||||||
|
if (ptr == NULL || ptr == LOCAL_FileNameBuf || ptr == LOCAL_FileNameBuf2)
|
||||||
|
return;
|
||||||
|
free((void *)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -418,9 +418,11 @@ static xarg *setReadEnv(Term opts, FEnv *fe, struct renv *re, int inp_stream) {
|
|||||||
if (fe->cmod == TermProlog)
|
if (fe->cmod == TermProlog)
|
||||||
fe->cmod = PROLOG_MODULE;
|
fe->cmod = PROLOG_MODULE;
|
||||||
if (args[READ_BACKQUOTED_STRING].used) {
|
if (args[READ_BACKQUOTED_STRING].used) {
|
||||||
if (!setBackQuotesFlag(args[READ_BACKQUOTED_STRING].tvalue))
|
if (!setBackQuotesFlag(args[READ_BACKQUOTED_STRING].tvalue)) {
|
||||||
|
free(args);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (args[READ_QUASI_QUOTATIONS].used) {
|
if (args[READ_QUASI_QUOTATIONS].used) {
|
||||||
fe->qq = args[READ_QUASI_QUOTATIONS].tvalue;
|
fe->qq = args[READ_QUASI_QUOTATIONS].tvalue;
|
||||||
} else {
|
} else {
|
||||||
@ -651,6 +653,7 @@ static bool complete_processing(FEnv *fe, TokEntry *tokstart) {
|
|||||||
else
|
else
|
||||||
tp = 0L;
|
tp = 0L;
|
||||||
Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable);
|
Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable);
|
||||||
|
free(fe->args);
|
||||||
|
|
||||||
// trail must be ok by now.]
|
// trail must be ok by now.]
|
||||||
if (fe->t) {
|
if (fe->t) {
|
||||||
@ -685,7 +688,7 @@ static bool complete_clause_processing(FEnv *fe, TokEntry *tokstart) {
|
|||||||
else
|
else
|
||||||
v_pos = 0L;
|
v_pos = 0L;
|
||||||
Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable);
|
Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable);
|
||||||
|
free(fe->args);
|
||||||
// trail must be ok by now.]
|
// trail must be ok by now.]
|
||||||
if (fe->t) {
|
if (fe->t) {
|
||||||
return (!v_vp || Yap_unify(v_vp, fe->vp)) &&
|
return (!v_vp || Yap_unify(v_vp, fe->vp)) &&
|
||||||
|
@ -639,6 +639,7 @@ static Int cont_stream_property(USES_REGS1) { /* current_stream */
|
|||||||
if (IsAtomTerm(args[STREAM_PROPERTY_ALIAS].tvalue)) {
|
if (IsAtomTerm(args[STREAM_PROPERTY_ALIAS].tvalue)) {
|
||||||
// one solution only
|
// one solution only
|
||||||
i = Yap_CheckAlias(AtomOfTerm(args[STREAM_PROPERTY_ALIAS].tvalue));
|
i = Yap_CheckAlias(AtomOfTerm(args[STREAM_PROPERTY_ALIAS].tvalue));
|
||||||
|
free(args)
|
||||||
UNLOCK(GLOBAL_Stream[i].streamlock);
|
UNLOCK(GLOBAL_Stream[i].streamlock);
|
||||||
if (i < 0 || !Yap_unify(ARG1, Yap_MkStream(i))) {
|
if (i < 0 || !Yap_unify(ARG1, Yap_MkStream(i))) {
|
||||||
cut_fail();
|
cut_fail();
|
||||||
|
73
os/sysbits.c
73
os/sysbits.c
@ -1,19 +1,19 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* *
|
* *
|
||||||
* YAP Prolog *
|
* YAP Prolog *
|
||||||
* *
|
* *
|
||||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
||||||
* *
|
* *
|
||||||
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
||||||
* *
|
* *
|
||||||
**************************************************************************
|
**************************************************************************
|
||||||
* *
|
* *
|
||||||
* File: sysbits.c *
|
* File: sysbits.c *
|
||||||
* Last rev: 4/03/88 *
|
* Last rev: 4/03/88 *
|
||||||
* mods: *
|
* mods: *
|
||||||
* comments: very much machine dependent routines *
|
* comments: very much machine dependent routines *
|
||||||
* *
|
* *
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
#ifdef SCCS
|
#ifdef SCCS
|
||||||
static char SccsId[] = "%W% %G%";
|
static char SccsId[] = "%W% %G%";
|
||||||
#endif
|
#endif
|
||||||
@ -51,12 +51,6 @@ static const char *expandVars(const char *spec, char *u);
|
|||||||
|
|
||||||
void exit(int);
|
void exit(int);
|
||||||
|
|
||||||
static void freeBuffer(const void *ptr) {
|
|
||||||
CACHE_REGS
|
|
||||||
if (ptr == NULL || ptr == LOCAL_FileNameBuf || ptr == LOCAL_FileNameBuf2)
|
|
||||||
return;
|
|
||||||
free((void *)ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
void Yap_WinError(char *yap_error) {
|
void Yap_WinError(char *yap_error) {
|
||||||
@ -771,7 +765,9 @@ static Int real_path(USES_REGS1) {
|
|||||||
if (!rc0) {
|
if (!rc0) {
|
||||||
PlIOError(SYSTEM_ERROR_OPERATING_SYSTEM, ARG1, NULL);
|
PlIOError(SYSTEM_ERROR_OPERATING_SYSTEM, ARG1, NULL);
|
||||||
}
|
}
|
||||||
return Yap_unify(MkAtomTerm(Yap_LookupAtom(rc0)), ARG2);
|
bool out = Yap_unify(MkAtomTerm(Yap_LookupAtom(rc0)), ARG2);
|
||||||
|
freeBuffer(rc0);
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EXPAND_FILENAME_DEFS() \
|
#define EXPAND_FILENAME_DEFS() \
|
||||||
@ -797,7 +793,7 @@ static Term do_expand_file_name(Term t1, Term opts USES_REGS) {
|
|||||||
xarg *args;
|
xarg *args;
|
||||||
expand_filename_enum_choices_t i;
|
expand_filename_enum_choices_t i;
|
||||||
bool use_system_expansion = true;
|
bool use_system_expansion = true;
|
||||||
char *tmpe = NULL;
|
const char *tmpe = NULL;
|
||||||
const char *spec;
|
const char *spec;
|
||||||
Term tf;
|
Term tf;
|
||||||
|
|
||||||
@ -828,7 +824,7 @@ static Term do_expand_file_name(Term t1, Term opts USES_REGS) {
|
|||||||
if (args == NULL) {
|
if (args == NULL) {
|
||||||
return TermNil;
|
return TermNil;
|
||||||
}
|
}
|
||||||
tmpe = malloc(YAP_FILENAME_MAX + 1);
|
tmpe = NULL;
|
||||||
|
|
||||||
for (i = 0; i < EXPAND_FILENAME_END; i++) {
|
for (i = 0; i < EXPAND_FILENAME_END; i++) {
|
||||||
if (args[i].used) {
|
if (args[i].used) {
|
||||||
@ -836,11 +832,12 @@ static Term do_expand_file_name(Term t1, Term opts USES_REGS) {
|
|||||||
switch (i) {
|
switch (i) {
|
||||||
case EXPAND_FILENAME_PARAMETER_EXPANSION:
|
case EXPAND_FILENAME_PARAMETER_EXPANSION:
|
||||||
if (t == TermProlog) {
|
if (t == TermProlog) {
|
||||||
const char *s = expandVars(spec, LOCAL_FileNameBuf);
|
tmpe = expandVars(spec, LOCAL_FileNameBuf);
|
||||||
if (s == NULL) {
|
if (tmpe == NULL) {
|
||||||
|
free(args);
|
||||||
return TermNil;
|
return TermNil;
|
||||||
}
|
}
|
||||||
strcpy(tmpe, s);
|
spec = tmpe;
|
||||||
} else if (t == TermTrue) {
|
} else if (t == TermTrue) {
|
||||||
use_system_expansion = true;
|
use_system_expansion = true;
|
||||||
} else if (t == TermFalse) {
|
} else if (t == TermFalse) {
|
||||||
@ -861,14 +858,28 @@ static Term do_expand_file_name(Term t1, Term opts USES_REGS) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(args);
|
||||||
if (!use_system_expansion) {
|
if (!use_system_expansion) {
|
||||||
const char *o = expandVars(spec, NULL);
|
const char *o = expandVars(spec, NULL);
|
||||||
if (!o)
|
if (!o)
|
||||||
return false;
|
return false;
|
||||||
return MkPairTerm(MkAtomTerm(Yap_LookupAtom(o)), TermNil);
|
tf = MkPairTerm(MkAtomTerm(Yap_LookupAtom(o)), TermNil);
|
||||||
|
#if _WIN32
|
||||||
|
if (o != cmd2)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
freeBuffer(o);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
tf = do_glob(spec, true);
|
tf = do_glob(spec, true);
|
||||||
|
}
|
||||||
|
if (tmpe
|
||||||
|
#if _WIN32
|
||||||
|
&& tmpe != cmd2
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
freeBuffer(tmpe);
|
||||||
|
}
|
||||||
return tf;
|
return tf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1391,7 +1402,9 @@ static Int true_file_name(USES_REGS1) {
|
|||||||
}
|
}
|
||||||
if (!(s = Yap_AbsoluteFile(s, LOCAL_FileNameBuf, true)))
|
if (!(s = Yap_AbsoluteFile(s, LOCAL_FileNameBuf, true)))
|
||||||
return false;
|
return false;
|
||||||
return Yap_unify(ARG2, MkAtomTerm(Yap_LookupAtom(s)));
|
bool rc = Yap_unify(ARG2, MkAtomTerm(Yap_LookupAtom(s)));
|
||||||
|
freeBuffer(s);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int p_expand_file_name(USES_REGS1) {
|
static Int p_expand_file_name(USES_REGS1) {
|
||||||
|
Reference in New Issue
Block a user