CCache: Fix memory/file descriptor leaks
Signed-off-by: Amarnath Valluri <amarnath.valluri@intel.com>
This commit is contained in:
parent
9b371b48d1
commit
478d5df911
5 changed files with 25 additions and 4 deletions
|
|
@ -130,6 +130,7 @@ static void failed(void)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
args_add_prefix(orig_args, p);
|
args_add_prefix(orig_args, p);
|
||||||
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ccache_verbose) {
|
if (ccache_verbose) {
|
||||||
|
|
@ -490,7 +491,9 @@ static void find_hash(ARGS *args)
|
||||||
/* also include the hash of the compiler name - as some compilers
|
/* also include the hash of the compiler name - as some compilers
|
||||||
use hard links and behave differently depending on the real name */
|
use hard links and behave differently depending on the real name */
|
||||||
if (st.st_nlink > 1) {
|
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);
|
hash_int(st.st_size);
|
||||||
|
|
@ -523,6 +526,7 @@ static void find_hash(ARGS *args)
|
||||||
input_base, tmp_string(),
|
input_base, tmp_string(),
|
||||||
i_extension);
|
i_extension);
|
||||||
x_asprintf(&path_stderr, "%s/tmp.cpp_stderr.%s", temp_dir, tmp_string());
|
x_asprintf(&path_stderr, "%s/tmp.cpp_stderr.%s", temp_dir, tmp_string());
|
||||||
|
free(input_base);
|
||||||
|
|
||||||
if (!direct_i_file) {
|
if (!direct_i_file) {
|
||||||
/* run cpp on the input file to obtain the .i */
|
/* 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 */
|
/* support user override of the compiler */
|
||||||
if ((path=getenv("CCACHE_CC"))) {
|
if ((path=getenv("CCACHE_CC"))) {
|
||||||
|
free(base);
|
||||||
base = x_strdup(path);
|
base = x_strdup(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -791,8 +796,10 @@ static void find_compiler(int argc, char **argv)
|
||||||
stats_update(STATS_COMPILER);
|
stats_update(STATS_COMPILER);
|
||||||
cc_log("could not find compiler (%s)\n", base);
|
cc_log("could not find compiler (%s)\n", base);
|
||||||
perror(base);
|
perror(base);
|
||||||
|
free(base);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
free(base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1076,6 +1083,7 @@ static void process_args(int argc, char **argv)
|
||||||
if (strlen(p) < 2) {
|
if (strlen(p) < 2) {
|
||||||
cc_log("badly formed dependency file %s\n", output_file);
|
cc_log("badly formed dependency file %s\n", output_file);
|
||||||
stats_update(STATS_ARGS);
|
stats_update(STATS_ARGS);
|
||||||
|
free(default_depfile_name);
|
||||||
failed();
|
failed();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -1093,6 +1101,7 @@ static void process_args(int argc, char **argv)
|
||||||
strcat(default_depfile_name, ".d");
|
strcat(default_depfile_name, ".d");
|
||||||
args_add(stripped_args, "-MF");
|
args_add(stripped_args, "-MF");
|
||||||
args_add(stripped_args, default_depfile_name);
|
args_add(stripped_args, default_depfile_name);
|
||||||
|
free(default_depfile_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dependency_target_specified) {
|
if (!dependency_target_specified) {
|
||||||
|
|
@ -1117,6 +1126,7 @@ static void process_args(int argc, char **argv)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
args_add_prefix(stripped_args, p);
|
args_add_prefix(stripped_args, p);
|
||||||
|
free(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1305,6 +1315,7 @@ static void setup_uncached_err(void)
|
||||||
|
|
||||||
if (putenv(buf) == -1) {
|
if (putenv(buf) == -1) {
|
||||||
cc_log("putenv failed\n");
|
cc_log("putenv failed\n");
|
||||||
|
close(uncached_fd);
|
||||||
stats_update(STATS_ERROR);
|
stats_update(STATS_ERROR);
|
||||||
failed();
|
failed();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -267,6 +267,7 @@ char *find_executable(const char *name, const char *exclude_name)
|
||||||
}
|
}
|
||||||
free(fname);
|
free(fname);
|
||||||
}
|
}
|
||||||
|
free(path);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,10 @@ static void stats_update_size(enum stats stat, size_t size, size_t numfiles)
|
||||||
|
|
||||||
memset(counters, 0, sizeof(counters));
|
memset(counters, 0, sizeof(counters));
|
||||||
|
|
||||||
if (lock_fd(fd) != 0) return;
|
if (lock_fd(fd) != 0) {
|
||||||
|
close(fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* read in the old stats */
|
/* read in the old stats */
|
||||||
stats_read_fd(fd, counters);
|
stats_read_fd(fd, counters);
|
||||||
|
|
|
||||||
|
|
@ -281,6 +281,7 @@ int unify_hash(const char *fname)
|
||||||
fd = open(fname, O_RDONLY|O_BINARY);
|
fd = open(fname, O_RDONLY|O_BINARY);
|
||||||
if (fd == -1 || fstat(fd, &st) != 0) {
|
if (fd == -1 || fstat(fd, &st) != 0) {
|
||||||
cc_log("Failed to open preprocessor output %s\n", fname);
|
cc_log("Failed to open preprocessor output %s\n", fname);
|
||||||
|
if (fd != -1) close(fd);
|
||||||
stats_update(STATS_PREPROCESSOR);
|
stats_update(STATS_PREPROCESSOR);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -289,12 +290,12 @@ int unify_hash(const char *fname)
|
||||||
lines in preprocessor output. I have seen lines of over
|
lines in preprocessor output. I have seen lines of over
|
||||||
100k in length, so this is well worth it */
|
100k in length, so this is well worth it */
|
||||||
map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||||
|
close(fd);
|
||||||
if (map == (char *)-1) {
|
if (map == (char *)-1) {
|
||||||
cc_log("Failed to mmap %s\n", fname);
|
cc_log("Failed to mmap %s\n", fname);
|
||||||
stats_update(STATS_PREPROCESSOR);
|
stats_update(STATS_PREPROCESSOR);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
close(fd);
|
|
||||||
|
|
||||||
/* pass it through the unifier */
|
/* pass it through the unifier */
|
||||||
unify((unsigned char *)map, st.st_size);
|
unify((unsigned char *)map, st.st_size);
|
||||||
|
|
|
||||||
|
|
@ -189,9 +189,11 @@ void copy_fd(int fd_in, int fd_out) {
|
||||||
|
|
||||||
while ((n = gzread(gz_in, buf, sizeof(buf))) > 0) {
|
while ((n = gzread(gz_in, buf, sizeof(buf))) > 0) {
|
||||||
if (write(fd_out, buf, n) != n) {
|
if (write(fd_out, buf, n) != n) {
|
||||||
|
gzclose(gz_in);
|
||||||
fatal("Failed to copy fd");
|
fatal("Failed to copy fd");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
gzclose(gz_in);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _copy_file(const char *src, const char *dest, int mode) {
|
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) {
|
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) {
|
if (!gz_out) {
|
||||||
gzclose(gz_in);
|
gzclose(gz_in);
|
||||||
|
close(dup_fd_out);
|
||||||
close(fd_out);
|
close(fd_out);
|
||||||
free(tmp_name);
|
free(tmp_name);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -459,6 +463,7 @@ int create_cachedirtag(const char *dir)
|
||||||
f = fopen(filename, "w");
|
f = fopen(filename, "w");
|
||||||
if (!f) goto error;
|
if (!f) goto error;
|
||||||
if (fwrite(CACHEDIR_TAG, sizeof(CACHEDIR_TAG)-1, 1, f) != 1) {
|
if (fwrite(CACHEDIR_TAG, sizeof(CACHEDIR_TAG)-1, 1, f) != 1) {
|
||||||
|
fclose(f);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (fclose(f)) goto error;
|
if (fclose(f)) goto error;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue