]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Disable hard link mode when the output object file is /dev/null
authorJoel Rosdahl <joel@rosdahl.net>
Sun, 22 Mar 2020 13:30:23 +0000 (14:30 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Sun, 22 Mar 2020 19:54:06 +0000 (20:54 +0100)
When hard link mode is enabled, ccache ≥3.6 unlinks the output file
before writing to it as a workaround for a bug in Clang (#331). This
unfortunately means that /dev/null will be removed when building as root
(don’t do that, BTW) with hard link mode enabled and /dev/null as the
the output file. A similar problem exists if the dependency file is
/dev/null, regardless of hard link mode.

Fix this by not unlinking the output file if it’s /dev/null and by not
copying files to /dev/null at all. (There is no need to handle other
non-regular output files since /dev/null is the only allowed non-regular
output file.)

Fixes #564.

src/ccache.c

index 6e9da51c2a9700a822ed7b059ace2bd6dca85c41..b9bafac2e4c617e70a31f35228f170dcece5668c 100644 (file)
@@ -1299,6 +1299,11 @@ move_file_to_cache_same_fs(const char *source, const char *dest)
 static void
 do_copy_or_link_file_from_cache(const char *source, const char *dest, bool copy)
 {
+       if (str_eq(dest, "/dev/null")) {
+               cc_log("Skipping copy from %s to %s", source, dest);
+               return;
+       }
+
        int ret;
        bool do_link = !copy && conf->hard_link && !file_is_compressed(source);
        if (do_link) {
@@ -1432,7 +1437,8 @@ to_cache(struct args *args, struct hash *depend_mode_hash)
        args_add(args, "-o");
        args_add(args, output_obj);
 
-       if (conf->hard_link) {
+       if (conf->hard_link && !str_eq(output_obj, "/dev/null")) {
+               // This is a workaround for https://bugs.llvm.org/show_bug.cgi?id=39782.
                x_unlink(output_obj);
        }