devenv内部のnixがSEGVして死ぬ
前提
code:zsh
$ uname -a
Linux nixos 6.9.11-lqx1 #1-NixOS ZEN SMP PREEMPT_DYNAMIC Tue Jan 1 00:00:00 UTC 1980 x86_64 GNU/Linux $ devenv version
devenv 1.0.8 (x86_64-linux)`
nyarla.icon
ちなみに私は独自にカスタムした github:NixOS/nixpkgs/master を使っています
状況
devenv 内部で行なわれる nix コマンドの実行がすべて失敗する
devenv は内部で独自にカスタマイズした nixを使っている
devenv 内部で使われる nix を直接叩くと SEGV している(Core dumpして死ぬ)
どうして……
追記: 2024-08-24
というのも XanMod kernel に変えてからは普通に動いているため というよりこれの内容的に Liquorix kernel だとバグを踏む感じっぽい?
Any Nix command ends with SIGSEGV immediately. This happens after switching to Liquorix kernel (after reboot).
原因
これ
コードを見る限り cpuMaxPartsの size を確認しないで配列にアクセスしているっぽい
→ その結果として cpuMaxParts の size が 2 以下だとコア吐いて死ぬ
そして devenv が内部で使っている nix-2.21 では上記パッチが取り込まれていない!!
→ その結果として当然死ぬ
→ だったら直しましょう!!1
対策
nyarla.icon のところではこうなった
やっていること
上記問題に対処した nix for devenv をビルド
上記を devenv に使わせる
最終的なコードはこれ ↓
code:pkgs/temporary.nix
prev: final: {
devenv =
let
inherit (super) cachix;
devenv_nix = super.nixVersions.nix_2_21.overrideAttrs (old: {
version = "2.21-devenv";
src = super.fetchFromGitHub {
owner = "domenkozar";
repo = "nix";
rev = "31b9700169d9bba693c379d59d587cd20bf115a6";
hash = "sha256-aUqR+pxqKTKLtj8HAI5sbdT6C1VgtHDcrKjmn+wWkXQ=";
};
doCheck = false;
doInstallCheck = false;
});
in
super.devenv.overrideAttrs (_: {
postInstall = ''
wrapProgram $out/bin/devenv --set DEVENV_NIX ${devenv_nix} --prefix PATH ":" "$out/bin:${cachix}/bin"
'';
});
}
code:fix-nix-2_21-devenv.patch
--- a/src/libutil/current-process.cc 2024-08-03 20:03:24.044223025 +0900
+++ a/src/libutil/current-process.cc 2024-08-03 20:03:58.201385917 +0900
@@ -38,6 +38,11 @@
auto cpuMax = readFile(cpuFile);
auto cpuMaxParts = tokenizeString<std::vector<std::string>>(cpuMax, " \n");
+
+ if (cpuMaxParts.size() != 2) {
+ return 0;
+ }
+
auto quota = cpuMaxParts0; auto period = cpuMaxParts1; if (quota != "max")
注意
nix のライセンスは LGPL v2.1 なので、上記パッチもLGPL v2.1という扱いでお願いします