summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2016-06-26 00:07:10 +0100
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2016-06-26 00:16:30 +0100
commit2da7e066b331d2aff98ef8f20d151bfef67497c7 (patch)
treef2e067b6db66c3d4f59750d3739a3325d3222ddc
parent875aca59760bbccb8343723b2263a85fa8e5d455 (diff)
parentadfa531a3b602d953e4127bc0968c30e5afa584d (diff)
downloadswig-2da7e066b331d2aff98ef8f20d151bfef67497c7.tar.gz
Merge branch 'avalluri-leaks'
* avalluri-leaks: whitespace fix memory leak improvements - delete at end of scope CCache: Fix typo in null check CCache: Fix memory/file descriptor leaks scilab.cxx: Fix memory leaks Fix leaked file descriptor Lua: Fix possible memory leaks go.cxx: Fix use of a freed variable Closes #710 Closes #712 Closes #713 Closes #715 Closes #716
-rw-r--r--CCache/ccache.c13
-rw-r--r--CCache/execute.c1
-rw-r--r--CCache/stats.c5
-rw-r--r--CCache/unify.c3
-rw-r--r--CCache/util.c9
-rw-r--r--Source/Modules/go.cxx3
-rw-r--r--Source/Modules/lua.cxx3
-rw-r--r--Source/Modules/scilab.cxx4
-rw-r--r--Source/Swig/include.c1
9 files changed, 36 insertions, 6 deletions
diff --git a/CCache/ccache.c b/CCache/ccache.c
index e7dd1d30a..c5c510388 100644
--- a/CCache/ccache.c
+++ b/CCache/ccache.c
@@ -130,6 +130,7 @@ static void failed(void)
exit(1);
}
args_add_prefix(orig_args, p);
+ free(p);
}
if (ccache_verbose) {
@@ -490,7 +491,9 @@ static void find_hash(ARGS *args)
/* also include the hash of the compiler name - as some compilers
use hard links and behave differently depending on the real name */
if (st.st_nlink > 1) {
- hash_string(str_basename(args->argv[0]));
+ char *path = str_basename(args->argv[0]);
+ hash_string(path);
+ free(path);
}
hash_int(st.st_size);
@@ -523,6 +526,7 @@ static void find_hash(ARGS *args)
input_base, tmp_string(),
i_extension);
x_asprintf(&path_stderr, "%s/tmp.cpp_stderr.%s", temp_dir, tmp_string());
+ free(input_base);
if (!direct_i_file) {
/* run cpp on the input file to obtain the .i */
@@ -781,6 +785,7 @@ static void find_compiler(int argc, char **argv)
/* support user override of the compiler */
if ((path=getenv("CCACHE_CC"))) {
+ free(base);
base = x_strdup(path);
}
@@ -791,8 +796,10 @@ static void find_compiler(int argc, char **argv)
stats_update(STATS_COMPILER);
cc_log("could not find compiler (%s)\n", base);
perror(base);
+ free(base);
exit(1);
}
+ free(base);
}
@@ -1076,6 +1083,7 @@ static void process_args(int argc, char **argv)
if (strlen(p) < 2) {
cc_log("badly formed dependency file %s\n", output_file);
stats_update(STATS_ARGS);
+ free(default_depfile_name);
failed();
return;
}
@@ -1093,6 +1101,7 @@ static void process_args(int argc, char **argv)
strcat(default_depfile_name, ".d");
args_add(stripped_args, "-MF");
args_add(stripped_args, default_depfile_name);
+ free(default_depfile_name);
}
if (!dependency_target_specified) {
@@ -1117,6 +1126,7 @@ static void process_args(int argc, char **argv)
exit(1);
}
args_add_prefix(stripped_args, p);
+ free(p);
}
}
@@ -1305,6 +1315,7 @@ static void setup_uncached_err(void)
if (putenv(buf) == -1) {
cc_log("putenv failed\n");
+ close(uncached_fd);
stats_update(STATS_ERROR);
failed();
}
diff --git a/CCache/execute.c b/CCache/execute.c
index 165b91e66..6df025e95 100644
--- a/CCache/execute.c
+++ b/CCache/execute.c
@@ -267,6 +267,7 @@ char *find_executable(const char *name, const char *exclude_name)
}
free(fname);
}
+ free(path);
return NULL;
#endif
diff --git a/CCache/stats.c b/CCache/stats.c
index d2122bcd3..4d01d2afa 100644
--- a/CCache/stats.c
+++ b/CCache/stats.c
@@ -138,7 +138,10 @@ static void stats_update_size(enum stats stat, size_t size, size_t numfiles)
memset(counters, 0, sizeof(counters));
- if (lock_fd(fd) != 0) return;
+ if (lock_fd(fd) != 0) {
+ close(fd);
+ return;
+ }
/* read in the old stats */
stats_read_fd(fd, counters);
diff --git a/CCache/unify.c b/CCache/unify.c
index a93d48a02..7a36476a1 100644
--- a/CCache/unify.c
+++ b/CCache/unify.c
@@ -281,6 +281,7 @@ int unify_hash(const char *fname)
fd = open(fname, O_RDONLY|O_BINARY);
if (fd == -1 || fstat(fd, &st) != 0) {
cc_log("Failed to open preprocessor output %s\n", fname);
+ if (fd != -1) close(fd);
stats_update(STATS_PREPROCESSOR);
return -1;
}
@@ -289,12 +290,12 @@ int unify_hash(const char *fname)
lines in preprocessor output. I have seen lines of over
100k in length, so this is well worth it */
map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ close(fd);
if (map == (char *)-1) {
cc_log("Failed to mmap %s\n", fname);
stats_update(STATS_PREPROCESSOR);
return -1;
}
- close(fd);
/* pass it through the unifier */
unify((unsigned char *)map, st.st_size);
diff --git a/CCache/util.c b/CCache/util.c
index 66f9823b9..ef90e2336 100644
--- a/CCache/util.c
+++ b/CCache/util.c
@@ -189,9 +189,11 @@ void copy_fd(int fd_in, int fd_out) {
while ((n = gzread(gz_in, buf, sizeof(buf))) > 0) {
if (write(fd_out, buf, n) != n) {
+ gzclose(gz_in);
fatal("Failed to copy fd");
}
}
+ gzclose(gz_in);
}
static int _copy_file(const char *src, const char *dest, int mode) {
@@ -248,9 +250,11 @@ static int _copy_file(const char *src, const char *dest, int mode) {
}
if (mode == COPY_TO_CACHE) {
- gz_out = gzdopen(dup(fd_out), "wb");
+ int dup_fd_out = dup(fd_out);
+ gz_out = gzdopen(dup_fd_out, "wb");
if (!gz_out) {
gzclose(gz_in);
+ close(dup_fd_out);
close(fd_out);
free(tmp_name);
return -1;
@@ -459,6 +463,7 @@ int create_cachedirtag(const char *dir)
f = fopen(filename, "w");
if (!f) goto error;
if (fwrite(CACHEDIR_TAG, sizeof(CACHEDIR_TAG)-1, 1, f) != 1) {
+ fclose(f);
goto error;
}
if (fclose(f)) goto error;
@@ -485,7 +490,7 @@ void x_asprintf(char **ptr, const char *format, ...)
}
va_end(ap);
- if (!ptr) fatal("out of memory in x_asprintf");
+ if (!*ptr) fatal("out of memory in x_asprintf");
}
/*
diff --git a/Source/Modules/go.cxx b/Source/Modules/go.cxx
index 6013fa15b..7fa9b2670 100644
--- a/Source/Modules/go.cxx
+++ b/Source/Modules/go.cxx
@@ -4176,7 +4176,6 @@ private:
Wrapper *dummy = NewWrapper();
emit_attach_parmmaps(parms, dummy);
- DelWrapper(dummy);
Swig_typemap_attach_parms("gotype", parms, NULL);
Swig_typemap_attach_parms("imtype", parms, NULL);
@@ -4233,6 +4232,8 @@ private:
Swig_typemap_attach_parms("goin", parms, dummy);
Swig_typemap_attach_parms("goargout", parms, dummy);
+ DelWrapper(dummy);
+
if (!is_ignored) {
// We use an interface to see if this method is defined in Go.
Printv(f_go_wrappers, "type ", interface_name, " interface {\n", NULL);
diff --git a/Source/Modules/lua.cxx b/Source/Modules/lua.cxx
index 1b4c8f617..80ea47f3f 100644
--- a/Source/Modules/lua.cxx
+++ b/Source/Modules/lua.cxx
@@ -856,6 +856,9 @@ public:
//Printf(stdout,"Swig_overload_dispatch %s %s '%s' %d\n",symname,wname,dispatch,maxargs);
if (!luaAddSymbol(lua_name, n)) {
+ DelWrapper(f);
+ Delete(dispatch);
+ Delete(tmp);
return SWIG_ERROR;
}
diff --git a/Source/Modules/scilab.cxx b/Source/Modules/scilab.cxx
index 42df12f7c..137adc234 100644
--- a/Source/Modules/scilab.cxx
+++ b/Source/Modules/scilab.cxx
@@ -326,6 +326,7 @@ public:
bool isLastOverloaded = isOverloaded && !Getattr(node, "sym:nextSibling");
if (!isOverloaded && !addSymbol(functionName, node)) {
+ DelWrapper(wrapper);
return SWIG_ERROR;
}
@@ -633,7 +634,10 @@ public:
/* Add function to builder table */
addFunctionToScilab(scilabSetFunctionName, setFunctionName);
+
+ DelWrapper(setFunctionWrapper);
}
+ DelWrapper(getFunctionWrapper);
return SWIG_OK;
}
diff --git a/Source/Swig/include.c b/Source/Swig/include.c
index 08226a25c..94df338f0 100644
--- a/Source/Swig/include.c
+++ b/Source/Swig/include.c
@@ -291,6 +291,7 @@ int Swig_insert_file(const_String_or_char_ptr filename, File *outfile) {
while ((nbytes = Read(f, buffer, 4096)) > 0) {
Write(outfile, buffer, nbytes);
}
+ fclose(f);
return 0;
}