aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--boehmgc-coroutine-sp-fallback.diff77
-rw-r--r--flake.lock8
-rw-r--r--flake.nix14
-rw-r--r--src/libutil/canon-path.hh2
-rw-r--r--tests/fetchGitSubmodules.sh9
5 files changed, 19 insertions, 91 deletions
diff --git a/boehmgc-coroutine-sp-fallback.diff b/boehmgc-coroutine-sp-fallback.diff
deleted file mode 100644
index 8fdafbecb..000000000
--- a/boehmgc-coroutine-sp-fallback.diff
+++ /dev/null
@@ -1,77 +0,0 @@
-diff --git a/darwin_stop_world.c b/darwin_stop_world.c
-index 3dbaa3fb..36a1d1f7 100644
---- a/darwin_stop_world.c
-+++ b/darwin_stop_world.c
-@@ -352,6 +352,7 @@ GC_INNER void GC_push_all_stacks(void)
- int nthreads = 0;
- word total_size = 0;
- mach_msg_type_number_t listcount = (mach_msg_type_number_t)THREAD_TABLE_SZ;
-+ size_t stack_limit;
- if (!EXPECT(GC_thr_initialized, TRUE))
- GC_thr_init();
-
-@@ -407,6 +408,19 @@ GC_INNER void GC_push_all_stacks(void)
- GC_push_all_stack_sections(lo, hi, p->traced_stack_sect);
- }
- if (altstack_lo) {
-+ // When a thread goes into a coroutine, we lose its original sp until
-+ // control flow returns to the thread.
-+ // While in the coroutine, the sp points outside the thread stack,
-+ // so we can detect this and push the entire thread stack instead,
-+ // as an approximation.
-+ // We assume that the coroutine has similarly added its entire stack.
-+ // This could be made accurate by cooperating with the application
-+ // via new functions and/or callbacks.
-+ stack_limit = pthread_get_stacksize_np(p->id);
-+ if (altstack_lo >= altstack_hi || altstack_lo < altstack_hi - stack_limit) { // sp outside stack
-+ altstack_lo = altstack_hi - stack_limit;
-+ }
-+
- total_size += altstack_hi - altstack_lo;
- GC_push_all_stack(altstack_lo, altstack_hi);
- }
-diff --git a/pthread_stop_world.c b/pthread_stop_world.c
-index 4b2c429..1fb4c52 100644
---- a/pthread_stop_world.c
-+++ b/pthread_stop_world.c
-@@ -673,6 +673,8 @@ GC_INNER void GC_push_all_stacks(void)
- struct GC_traced_stack_sect_s *traced_stack_sect;
- pthread_t self = pthread_self();
- word total_size = 0;
-+ size_t stack_limit;
-+ pthread_attr_t pattr;
-
- if (!EXPECT(GC_thr_initialized, TRUE))
- GC_thr_init();
-@@ -722,6 +724,31 @@ GC_INNER void GC_push_all_stacks(void)
- hi = p->altstack + p->altstack_size;
- /* FIXME: Need to scan the normal stack too, but how ? */
- /* FIXME: Assume stack grows down */
-+ } else {
-+ if (pthread_getattr_np(p->id, &pattr)) {
-+ ABORT("GC_push_all_stacks: pthread_getattr_np failed!");
-+ }
-+ if (pthread_attr_getstacksize(&pattr, &stack_limit)) {
-+ ABORT("GC_push_all_stacks: pthread_attr_getstacksize failed!");
-+ }
-+ if (pthread_attr_destroy(&pattr)) {
-+ ABORT("GC_push_all_stacks: pthread_attr_destroy failed!");
-+ }
-+ // When a thread goes into a coroutine, we lose its original sp until
-+ // control flow returns to the thread.
-+ // While in the coroutine, the sp points outside the thread stack,
-+ // so we can detect this and push the entire thread stack instead,
-+ // as an approximation.
-+ // We assume that the coroutine has similarly added its entire stack.
-+ // This could be made accurate by cooperating with the application
-+ // via new functions and/or callbacks.
-+ #ifndef STACK_GROWS_UP
-+ if (lo >= hi || lo < hi - stack_limit) { // sp outside stack
-+ lo = hi - stack_limit;
-+ }
-+ #else
-+ #error "STACK_GROWS_UP not supported in boost_coroutine2 (as of june 2021), so we don't support it in Nix."
-+ #endif
- }
- GC_push_all_stack_sections(lo, hi, traced_stack_sect);
- # ifdef STACK_GROWS_UP
diff --git a/flake.lock b/flake.lock
index a66c9cb1b..4490b5ead 100644
--- a/flake.lock
+++ b/flake.lock
@@ -18,16 +18,16 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1657693803,
- "narHash": "sha256-G++2CJ9u0E7NNTAi9n5G8TdDmGJXcIjkJ3NF8cetQB8=",
+ "lastModified": 1670461440,
+ "narHash": "sha256-jy1LB8HOMKGJEGXgzFRLDU1CBGL0/LlkolgnqIsF0D8=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "365e1b3a859281cf11b94f87231adeabbdd878a2",
+ "rev": "04a75b2eecc0acf6239acf9dd04485ff8d14f425",
"type": "github"
},
"original": {
"owner": "NixOS",
- "ref": "nixos-22.05-small",
+ "ref": "nixos-22.11-small",
"repo": "nixpkgs",
"type": "github"
}
diff --git a/flake.nix b/flake.nix
index 4ba3f04b0..652695989 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,7 +1,7 @@
{
description = "The purely functional package manager";
- inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.05-small";
+ inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11-small";
inputs.nixpkgs-regression.url = "github:NixOS/nixpkgs/215d4d0fd80ca5163643b03a33fde804a29cc1e2";
inputs.lowdown-src = { url = "github:kristapsdz/lowdown"; flake = false; };
@@ -108,7 +108,7 @@
++ lib.optionals stdenv.hostPlatform.isLinux [(buildPackages.util-linuxMinimal or buildPackages.utillinuxMinimal)];
buildDeps =
- [ (curl.override { patchNetrcRegression = true; })
+ [ curl
bzip2 xz brotli editline
openssl sqlite
libarchive
@@ -127,13 +127,9 @@
});
propagatedDeps =
- [ ((boehmgc.override {
+ [ (boehmgc.override {
enableLargeConfig = true;
- }).overrideAttrs(o: {
- patches = (o.patches or []) ++ [
- ./boehmgc-coroutine-sp-fallback.diff
- ];
- }))
+ })
nlohmann_json
];
};
@@ -364,7 +360,7 @@
buildInputs =
[ nix
- (curl.override { patchNetrcRegression = true; })
+ curl
bzip2
xz
pkgs.perl
diff --git a/src/libutil/canon-path.hh b/src/libutil/canon-path.hh
index c5e7f0596..9d5984584 100644
--- a/src/libutil/canon-path.hh
+++ b/src/libutil/canon-path.hh
@@ -110,7 +110,7 @@ public:
std::optional<std::string_view> dirOf() const
{
if (isRoot()) return std::nullopt;
- return path.substr(0, path.rfind('/'));
+ return ((std::string_view) path).substr(0, path.rfind('/'));
}
std::optional<std::string_view> baseName() const
diff --git a/tests/fetchGitSubmodules.sh b/tests/fetchGitSubmodules.sh
index 5f104355f..50da4cb97 100644
--- a/tests/fetchGitSubmodules.sh
+++ b/tests/fetchGitSubmodules.sh
@@ -14,6 +14,15 @@ subRepo=$TEST_ROOT/gitSubmodulesSub
rm -rf ${rootRepo} ${subRepo} $TEST_HOME/.cache/nix
+# Submodules can't be fetched locally by default, which can cause
+# information leakage vulnerabilities, but for these tests our
+# submodule is intentionally local and it's all trusted, so we
+# disable this restriction. Setting it per repo is not sufficient, as
+# the repo-local config does not apply to the commands run from
+# outside the repos by Nix.
+export XDG_CONFIG_HOME=$TEST_HOME/.config
+git config --global protocol.file.allow always
+
initGitRepo() {
git init $1
git -C $1 config user.email "foobar@example.com"