summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-util/ccache/files/ccache-3.1.10-real-temp-files.patch')
-rw-r--r--dev-util/ccache/files/ccache-3.1.10-real-temp-files.patch185
1 files changed, 185 insertions, 0 deletions
diff --git a/dev-util/ccache/files/ccache-3.1.10-real-temp-files.patch b/dev-util/ccache/files/ccache-3.1.10-real-temp-files.patch
new file mode 100644
index 000000000000..45e654105170
--- /dev/null
+++ b/dev-util/ccache/files/ccache-3.1.10-real-temp-files.patch
@@ -0,0 +1,185 @@
+https://lists.samba.org/archive/ccache/2014q4/001246.html
+
+From 5d0f507a4162ac89e05ca633dbc8056454b798f5 Mon Sep 17 00:00:00 2001
+From: Mike Frysinger <vapier@gentoo.org>
+Date: Mon, 15 Sep 2014 18:15:02 -0400
+Subject: [PATCH] do not rely on pids being unique
+
+Linux supports creating pid namespaces cheaply and running processes
+inside of them. When you try to share a single cache among multiple
+such runs, the fact that the code relies on pid numbers as globally
+unique values quickly fails. Instead, switch to standard mkstemp to
+generate temp files for us.
+
+Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+---
+ ccache.c | 12 ++++++------
+ ccache.h | 2 +-
+ manifest.c | 2 +-
+ stats.c | 10 +++++++++-
+ util.c | 13 ++++++++-----
+ 5 files changed, 25 insertions(+), 14 deletions(-)
+
+diff --git a/ccache.c b/ccache.c
+index 02dbdfa..1dc0a06 100644
+--- a/ccache.c
++++ b/ccache.c
+@@ -526,8 +526,11 @@ to_cache(struct args *args)
+ unsigned added_files = 0;
+
+ tmp_stdout = format("%s.tmp.stdout.%s", cached_obj, tmp_string());
++ create_empty_file(tmp_stdout);
+ tmp_stderr = format("%s.tmp.stderr.%s", cached_obj, tmp_string());
++ create_empty_file(tmp_stderr);
+ tmp_obj = format("%s.tmp.%s", cached_obj, tmp_string());
++ create_empty_file(tmp_obj);
+
+ args_add(args, "-o");
+ args_add(args, tmp_obj);
+@@ -579,7 +582,7 @@ to_cache(struct args *args)
+ int fd_result;
+ char *tmp_stderr2;
+
+- tmp_stderr2 = format("%s.tmp.stderr2.%s", cached_obj, tmp_string());
++ tmp_stderr2 = format("%s.2", tmp_stderr);
+ if (x_rename(tmp_stderr, tmp_stderr2)) {
+ cc_log("Failed to rename %s to %s: %s", tmp_stderr, tmp_stderr2,
+ strerror(errno));
+@@ -808,6 +808,7 @@ get_object_name_from_cpp(struct args *args, struct mdfour *hash)
+ }
+
+ path_stderr = format("%s/tmp.cpp_stderr.%s", temp_dir, tmp_string());
++ create_empty_file(path_stderr);
+ add_pending_tmp_file(path_stderr);
+
+ time_of_compilation = time(NULL);
+@@ -815,6 +816,7 @@ get_object_name_from_cpp(struct args *args, struct mdfour *hash)
+ if (!direct_i_file) {
+ path_stdout = format("%s/%s.tmp.%s.%s",
+ temp_dir, input_base, tmp_string(), i_extension);
++ create_empty_file(path_stdout);
+ add_pending_tmp_file(path_stdout);
+
+ /* run cpp on the input file to obtain the .i */
+@@ -838,11 +843,6 @@ get_object_name_from_cpp(struct args *args, struct mdfour *hash)
+ can skip the cpp stage and directly form the
+ correct i_tmpfile */
+ path_stdout = input_file;
+- if (create_empty_file(path_stderr) != 0) {
+- cc_log("Failed to create %s: %s", path_stderr, strerror(errno));
+- stats_update(STATS_ERROR);
+- failed();
+- }
+ status = 0;
+ }
+
+diff --git a/ccache.h b/ccache.h
+index 2bc7c87..43ef98d 100644
+--- a/ccache.h
++++ b/ccache.h
+@@ -130,7 +130,7 @@ size_t file_size(struct stat *st);
+ int safe_open(const char *fname);
+ char *x_realpath(const char *path);
+ char *gnu_getcwd(void);
+-int create_empty_file(const char *fname);
++int create_empty_file(char *fname);
+ const char *get_home_directory(void);
+ char *get_cwd();
+ bool same_executable_name(const char *s1, const char *s2);
+diff --git a/manifest.c b/manifest.c
+index 7f02ede..47566d5 100644
+--- a/manifest.c
++++ b/manifest.c
+@@ -633,7 +633,7 @@ manifest_put(const char *manifest_path, struct file_hash *object_hash,
+ }
+
+ tmp_file = format("%s.tmp.%s", manifest_path, tmp_string());
+- fd2 = safe_open(tmp_file);
++ fd2 = mkstemp(tmp_file);
+ if (fd2 == -1) {
+ cc_log("Failed to open %s", tmp_file);
+ goto out;
+diff --git a/stats.c b/stats.c
+index 2111b65..4ed39c2 100644
+--- a/stats.c
++++ b/stats.c
+@@ -126,11 +126,18 @@ stats_write(const char *path, struct counters *counters)
+ size_t i;
+ char *tmp_file;
+ FILE *f;
++ int fd;
+
+ tmp_file = format("%s.tmp.%s", path, tmp_string());
+- f = fopen(tmp_file, "wb");
++ fd = mkstemp(tmp_file);
++ if (fd == -1) {
++ cc_log("Failed to open %s", tmp_file);
++ goto end;
++ }
++ f = fdopen(fd, "wb");
+ if (!f) {
+ cc_log("Failed to open %s", tmp_file);
++ close(fd);
+ goto end;
+ }
+ for (i = 0; i < counters->size; i++) {
+@@ -138,6 +145,7 @@ stats_write(const char *path, struct counters *counters)
+ fatal("Failed to write to %s", tmp_file);
+ }
+ }
++ /* This also implicitly closes the fd. */
+ fclose(f);
+ x_rename(tmp_file, path);
+
+diff --git a/util.c b/util.c
+index 3b472de..cc630a6 100644
+--- a/util.c
++++ b/util.c
+@@ -195,7 +195,7 @@ copy_file(const char *src, const char *dest, int compress_dest)
+ struct stat st;
+ int errnum;
+
+- tmp_name = format("%s.%s.XXXXXX", dest, tmp_string());
++ tmp_name = format("%s.%s", dest, tmp_string());
+ cc_log("Copying %s to %s via %s (%s)",
+ src, dest, tmp_name, compress_dest ? "compressed": "uncompressed");
+
+@@ -427,7 +427,7 @@ tmp_string(void)
+ static char *ret;
+
+ if (!ret) {
+- ret = format("%s.%u", get_hostname(), (unsigned)getpid());
++ ret = format("%s.%u.XXXXXX", get_hostname(), (unsigned)getpid());
+ }
+
+ return ret;
+@@ -884,12 +884,13 @@ gnu_getcwd(void)
+
+ /* create an empty file */
+ int
+-create_empty_file(const char *fname)
++create_empty_file(char *fname)
+ {
+ int fd;
+
+- fd = open(fname, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_BINARY, 0666);
++ fd = mkstemp(fname);
+ if (fd == -1) {
++ cc_log("Failed to create %s: %s", fname, strerror(errno));
+ return -1;
+ }
+ close(fd);
+@@ -1134,7 +1135,9 @@ x_unlink(const char *path)
+ goto out;
+ }
+ if (unlink(tmp_name) == -1) {
+- result = -1;
++ /* If it was released in a race, that's OK. */
++ if (errno != ENOENT)
++ result = -1;
+ }
+ out:
+ free(tmp_name);
+--
+2.1.2
+