diff --git a/src/libstore/unix/build/derivation-builder.cc b/src/libstore/unix/build/derivation-builder.cc index 9935400b9..eca017487 100644 --- a/src/libstore/unix/build/derivation-builder.cc +++ b/src/libstore/unix/build/derivation-builder.cc @@ -2147,23 +2147,21 @@ std::unique_ptr makeDerivationBuilder( } #ifdef __linux__ - if (useSandbox) { - if (!mountAndPidNamespacesSupported()) { - if (!settings.sandboxFallback) - throw Error("this system does not support the kernel namespaces that are required for sandboxing; use '--no-sandbox' to disable sandboxing"); - debug("auto-disabling sandboxing because the prerequisite namespaces are not available"); - useSandbox = false; - } + if (useSandbox && !mountAndPidNamespacesSupported()) { + if (!settings.sandboxFallback) + throw Error("this system does not support the kernel namespaces that are required for sandboxing; use '--no-sandbox' to disable sandboxing"); + debug("auto-disabling sandboxing because the prerequisite namespaces are not available"); + useSandbox = false; } if (useSandbox) - return std::make_unique( + return std::make_unique( store, std::move(miscMethods), std::move(params)); #endif - if (params.drvOptions.useUidRange(params.drv)) + if (!useSandbox && params.drvOptions.useUidRange(params.drv)) throw Error("feature 'uid-range' is only supported in sandboxed builds"); #ifdef __APPLE__ @@ -2172,6 +2170,11 @@ std::unique_ptr makeDerivationBuilder( std::move(miscMethods), std::move(params), useSandbox); + #elif defined(__linux__) + return std::make_unique( + store, + std::move(miscMethods), + std::move(params)); #else if (useSandbox) throw Error("sandboxing builds is not supported on this platform"); diff --git a/src/libstore/unix/build/linux-derivation-builder.cc b/src/libstore/unix/build/linux-derivation-builder.cc index 23850c373..c27b87163 100644 --- a/src/libstore/unix/build/linux-derivation-builder.cc +++ b/src/libstore/unix/build/linux-derivation-builder.cc @@ -154,6 +154,18 @@ static void doBind(const Path & source, const Path & target, bool optional = fal } struct LinuxDerivationBuilder : DerivationBuilderImpl +{ + using DerivationBuilderImpl::DerivationBuilderImpl; + + void enterChroot() override + { + setupSeccomp(); + + linux::setPersonality(drv.platform); + } +}; + +struct ChrootLinuxDerivationBuilder : LinuxDerivationBuilder { /** * Pipe for synchronising updates to the builder namespaces. @@ -190,11 +202,7 @@ struct LinuxDerivationBuilder : DerivationBuilderImpl */ std::optional cgroup; - LinuxDerivationBuilder( - Store & store, std::unique_ptr miscMethods, DerivationBuilderParams params) - : DerivationBuilderImpl(store, std::move(miscMethods), std::move(params)) - { - } + using LinuxDerivationBuilder::LinuxDerivationBuilder; void deleteTmpDir(bool force) override { @@ -776,11 +784,7 @@ struct LinuxDerivationBuilder : DerivationBuilderImpl if (rmdir("real-root") == -1) throw SysError("cannot remove real-root directory"); - // FIXME: move to LinuxDerivationBuilder - setupSeccomp(); - - // FIXME: move to LinuxDerivationBuilder - linux::setPersonality(drv.platform); + LinuxDerivationBuilder::enterChroot(); } void setUser() override