diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2016-06-26 00:07:10 +0100 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2016-06-26 00:16:30 +0100 |
commit | 2da7e066b331d2aff98ef8f20d151bfef67497c7 (patch) | |
tree | f2e067b6db66c3d4f59750d3739a3325d3222ddc | |
parent | 875aca59760bbccb8343723b2263a85fa8e5d455 (diff) | |
parent | adfa531a3b602d953e4127bc0968c30e5afa584d (diff) | |
download | swig-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.c | 13 | ||||
-rw-r--r-- | CCache/execute.c | 1 | ||||
-rw-r--r-- | CCache/stats.c | 5 | ||||
-rw-r--r-- | CCache/unify.c | 3 | ||||
-rw-r--r-- | CCache/util.c | 9 | ||||
-rw-r--r-- | Source/Modules/go.cxx | 3 | ||||
-rw-r--r-- | Source/Modules/lua.cxx | 3 | ||||
-rw-r--r-- | Source/Modules/scilab.cxx | 4 | ||||
-rw-r--r-- | Source/Swig/include.c | 1 |
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; } |