From aba6eb348e0ed8177da1e7f1df46ba00d20eab96 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Mon, 19 Dec 2022 14:06:07 +0100 Subject: [PATCH] libstore: Make sure that initNix has been called Prevent bugs like https://github.com/cachix/cachix/pull/477 --- src/libexpr/tests/libexprtests.hh | 1 + src/libmain/shared.cc | 1 + src/libstore/globals.cc | 14 ++++++++++++++ src/libstore/globals.hh | 8 ++++++++ src/libstore/store-api.cc | 1 + 5 files changed, 25 insertions(+) diff --git a/src/libexpr/tests/libexprtests.hh b/src/libexpr/tests/libexprtests.hh index 4f6915882..4a03d4316 100644 --- a/src/libexpr/tests/libexprtests.hh +++ b/src/libexpr/tests/libexprtests.hh @@ -12,6 +12,7 @@ namespace nix { class LibExprTest : public ::testing::Test { public: static void SetUpTestSuite() { + initLibStore(); initGC(); } diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index a58428762..99e3d6f56 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -235,6 +235,7 @@ void initNix() #endif preloadNSS(); + initLibStore(); } diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc index b7f55cae7..130c5b670 100644 --- a/src/libstore/globals.cc +++ b/src/libstore/globals.cc @@ -291,4 +291,18 @@ void initPlugins() settings.pluginFiles.pluginsLoaded = true; } +static bool initLibStoreDone = false; + +void assertLibStoreInitialized() { + if (!initLibStoreDone) { + printError("The program must call nix::initNix() before calling any libstore library functions."); + abort(); + }; +} + +void initLibStore() { + initLibStoreDone = true; +} + + } diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh index 274a15dd7..22458efcf 100644 --- a/src/libstore/globals.hh +++ b/src/libstore/globals.hh @@ -984,4 +984,12 @@ std::vector getUserConfigFiles(); extern const std::string nixVersion; +/* NB: This is not sufficient. You need to call initNix() */ +void initLibStore(); + +/* It's important to initialize before doing _anything_, which is why we + call upon the programmer to handle this correctly. However, we only add + this in a key locations, so as not to litter the code. */ +void assertLibStoreInitialized(); + } diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 80b60ca1b..426230ca5 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -458,6 +458,7 @@ Store::Store(const Params & params) : StoreConfig(params) , state({(size_t) pathInfoCacheSize}) { + assertLibStoreInitialized(); }