memory leaks

This commit is contained in:
Vitor Santos Costa 2016-05-30 11:25:28 +01:00
parent 4ac6d11dca
commit 71c49f5063
5 changed files with 75 additions and 52 deletions

View File

@ -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;

View File

@ -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

View File

@ -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)) &&

View File

@ -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();

View File

@ -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) {