diff --git a/pkgs/os-specific/linux/firejail/default.nix b/pkgs/os-specific/linux/firejail/default.nix index fadf5df7140a..a3be5484a047 100644 --- a/pkgs/os-specific/linux/firejail/default.nix +++ b/pkgs/os-specific/linux/firejail/default.nix @@ -20,6 +20,15 @@ stdenv.mkDerivation { name = "${s.name}.tar.bz2"; }; + patches = [ + # Adds the /nix directory when using an overlay. + # Required to run any programs under this mode. + ./mount-nix-dir-on-overlay.patch + # By default fbuilder hardcodes the firejail binary to the install path. + # On NixOS the firejail binary is a setuid wrapper available in $PATH. + ./fbuilder-call-firejail-on-path.patch + ]; + prePatch = '' # Allow whitelisting ~/.nix-profile substituteInPlace etc/firejail.config --replace \ diff --git a/pkgs/os-specific/linux/firejail/fbuilder-call-firejail-on-path.patch b/pkgs/os-specific/linux/firejail/fbuilder-call-firejail-on-path.patch new file mode 100644 index 000000000000..6016891655b1 --- /dev/null +++ b/pkgs/os-specific/linux/firejail/fbuilder-call-firejail-on-path.patch @@ -0,0 +1,11 @@ +--- a/src/fbuilder/build_profile.c ++++ b/src/fbuilder/build_profile.c +@@ -67,7 +67,7 @@ + errExit("asprintf"); + + char *cmdlist[] = { +- BINDIR "/firejail", ++ "firejail", + "--quiet", + "--noprofile", + "--caps.drop=all", diff --git a/pkgs/os-specific/linux/firejail/mount-nix-dir-on-overlay.patch b/pkgs/os-specific/linux/firejail/mount-nix-dir-on-overlay.patch new file mode 100644 index 000000000000..685314f90758 --- /dev/null +++ b/pkgs/os-specific/linux/firejail/mount-nix-dir-on-overlay.patch @@ -0,0 +1,27 @@ +--- a/src/firejail/fs.c ++++ b/src/firejail/fs.c +@@ -1143,6 +1143,16 @@ + errExit("mounting /dev"); + fs_logger("whitelist /dev"); + ++ // mount-bind /nix ++ if (arg_debug) ++ printf("Mounting /nix\n"); ++ char *nix; ++ if (asprintf(&nix, "%s/nix", oroot) == -1) ++ errExit("asprintf"); ++ if (mount("/nix", nix, NULL, MS_BIND|MS_REC, NULL) < 0) ++ errExit("mounting /nix"); ++ fs_logger("whitelist /nix"); ++ + // mount-bind run directory + if (arg_debug) + printf("Mounting /run\n"); +@@ -1201,6 +1211,7 @@ + free(odiff); + free(owork); + free(dev); ++ free(nix); + free(run); + free(tmp); + }