summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaksim Denisov <denisov.maksim@huawei.com>2024-07-12 11:08:15 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2024-09-09 12:39:24 +0200
commitd17d0d9649ae47b383325020eb147b80e5ce75b3 (patch)
tree1b117dfdc9fe7e6cf548341976de8e2dbadab84e
parenta2204a921218e35ae29936561a5d3726cfbfa0e1 (diff)
downloadjustbuild-d17d0d9649ae47b383325020eb147b80e5ce75b3.tar.gz
Store newly spliced executables as copies.
During multithreaded splicing, the main process can be forked (inheriting open file descriptors). In this case, the executable file saved using hardlinking becomes inaccessible. To prevent this, executables must be stored as copies made in a child process. (cherry-picked from a336b835ee0831ba5fe2f4e8f9b1773eff68416b)
-rw-r--r--src/buildtool/storage/local_cas.tpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/buildtool/storage/local_cas.tpp b/src/buildtool/storage/local_cas.tpp
index 02c007d5..6a406b5f 100644
--- a/src/buildtool/storage/local_cas.tpp
+++ b/src/buildtool/storage/local_cas.tpp
@@ -321,8 +321,16 @@ requires(kIsLocalGeneration) auto LocalCAS<kDoGlobalUplink>::LocalUplinkBlob(
}
// Uplink blob from older generation to the latest generation.
- return blob_path_latest.has_value() or
- latest.StoreBlob</*kOwner=*/true>(*blob_path, is_executable);
+ if (spliced and is_executable) {
+ // During multithreaded splicing, the main process can be forked
+ // (inheriting open file descriptors). In this case, an executable file
+ // saved using hardlinking becomes inaccessible. To prevent this,
+ // executables must be stored as copies made in a child process.
+ return latest.StoreBlob</*kOwner=*/false>(*blob_path, is_executable)
+ .has_value();
+ }
+ return latest.StoreBlob</*kOwner=*/true>(*blob_path, is_executable)
+ .has_value();
}
template <bool kDoGlobalUplink>