From 8da983f65f73d211ae24bb7b51c08764b5995b3e Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Sun, 6 Nov 2022 22:03:18 -0800 Subject: [PATCH] boehmgc: disable SOFT_VDB on powerpc64le for version 8.2.2 Upstream has not yet fixed the bug: https://github.com/ivmai/bdwgc/issues/376 https://github.com/ivmai/bdwgc/issues/479 However there is a recommended workaround: https://github.com/ivmai/bdwgc/issues/479#issuecomment-1279687537 This adds `CFLAGS_EXTRA=-DNO_SOFT_VDB` to the `makeFlags`, which prevents direct accesses to `/proc` being used for tracking dirtied pages (which must be rescanned): https://github.com/ivmai/bdwgc/blob/54522af853de28f45195044dadfd795c4e5942aa/include/private/gcconfig.h#L741 The collector will fall back to using mprotect() to trigger page faults on writes to clean pages and maintain its own dirty bits, which is slightly less efficient but (in this case) more reliable. Unreliable page-dirtiness bits can lead to use-after-free() corruption; this is not a situation where disabling the tests is a good idea. --- pkgs/development/libraries/boehm-gc/default.nix | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pkgs/development/libraries/boehm-gc/default.nix b/pkgs/development/libraries/boehm-gc/default.nix index 513ae50298e26..1a5924fbf55ef 100644 --- a/pkgs/development/libraries/boehm-gc/default.nix +++ b/pkgs/development/libraries/boehm-gc/default.nix @@ -30,6 +30,17 @@ stdenv.mkDerivation (finalAttrs: { ++ lib.optional enableMmap "--enable-mmap" ++ lib.optional enableLargeConfig "--enable-large-config"; + # this stanza can be dropped when a release fixes this issue: + # https://github.com/ivmai/bdwgc/issues/376 + makeFlags = lib.optionals (stdenv.hostPlatform.isPower64 && + lib.versionAtLeast finalAttrs.version "8.2.2") + [ + # do not use /proc primitives to track dirty bits; see: + # https://github.com/ivmai/bdwgc/issues/479#issuecomment-1279687537 + # https://github.com/ivmai/bdwgc/blob/54522af853de28f45195044dadfd795c4e5942aa/include/private/gcconfig.h#L741 + "CFLAGS_EXTRA=-DNO_SOFT_VDB" + ]; + # `gctest` fails under emulation on aarch64-darwin doCheck = !(stdenv.isDarwin && stdenv.isx86_64);