mirror of
https://github.com/NixOS/nix.git
synced 2025-12-18 06:51:07 +01:00
Merge pull request #14774 from roberth/fix-getenv-segfault
Fix getenv segfault
This commit is contained in:
commit
a6eb2e91b7
6 changed files with 41 additions and 26 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
#include "nix/store/derivations.hh"
|
#include "nix/store/derivations.hh"
|
||||||
#include "nix/store/store-api.hh"
|
#include "nix/store/store-api.hh"
|
||||||
#include "nix/util/experimental-features.hh"
|
#include "nix/util/experimental-features.hh"
|
||||||
#include "nix/util/environment-variables.hh"
|
#include "nix/util/tests/test-data.hh"
|
||||||
#include "nix/store/store-open.hh"
|
#include "nix/store/store-open.hh"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
@ -50,11 +50,7 @@ static void BM_UnparseRealDerivationFile(benchmark::State & state, const std::st
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register benchmarks for actual test derivation files if they exist
|
// Register benchmarks for actual test derivation files if they exist
|
||||||
BENCHMARK_CAPTURE(
|
BENCHMARK_CAPTURE(BM_ParseRealDerivationFile, hello, (getUnitTestData() / "derivation/hello.drv").string());
|
||||||
BM_ParseRealDerivationFile, hello, getEnvNonEmpty("_NIX_TEST_UNIT_DATA").value() + "/derivation/hello.drv");
|
BENCHMARK_CAPTURE(BM_ParseRealDerivationFile, firefox, (getUnitTestData() / "derivation/firefox.drv").string());
|
||||||
BENCHMARK_CAPTURE(
|
BENCHMARK_CAPTURE(BM_UnparseRealDerivationFile, hello, (getUnitTestData() / "derivation/hello.drv").string());
|
||||||
BM_ParseRealDerivationFile, firefox, getEnvNonEmpty("_NIX_TEST_UNIT_DATA").value() + "/derivation/firefox.drv");
|
BENCHMARK_CAPTURE(BM_UnparseRealDerivationFile, firefox, (getUnitTestData() / "derivation/firefox.drv").string());
|
||||||
BENCHMARK_CAPTURE(
|
|
||||||
BM_UnparseRealDerivationFile, hello, getEnvNonEmpty("_NIX_TEST_UNIT_DATA").value() + "/derivation/hello.drv");
|
|
||||||
BENCHMARK_CAPTURE(
|
|
||||||
BM_UnparseRealDerivationFile, firefox, getEnvNonEmpty("_NIX_TEST_UNIT_DATA").value() + "/derivation/firefox.drv");
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#include "nix/store/tests/nix_api_store.hh"
|
#include "nix/store/tests/nix_api_store.hh"
|
||||||
#include "nix/store/globals.hh"
|
#include "nix/store/globals.hh"
|
||||||
#include "nix/util/tests/string_callback.hh"
|
#include "nix/util/tests/string_callback.hh"
|
||||||
|
#include "nix/util/tests/test-data.hh"
|
||||||
#include "nix/util/url.hh"
|
#include "nix/util/url.hh"
|
||||||
|
|
||||||
#include "store-tests-config.hh"
|
#include "store-tests-config.hh"
|
||||||
|
|
@ -302,7 +303,7 @@ public:
|
||||||
|
|
||||||
store = open_local_store();
|
store = open_local_store();
|
||||||
|
|
||||||
std::filesystem::path unitTestData{getenv("_NIX_TEST_UNIT_DATA")};
|
std::filesystem::path unitTestData = nix::getUnitTestData();
|
||||||
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << t.rdbuf();
|
buffer << t.rdbuf();
|
||||||
|
|
@ -357,7 +358,7 @@ TEST_F(nix_api_store_test_base, build_from_json)
|
||||||
|
|
||||||
auto * store = open_local_store();
|
auto * store = open_local_store();
|
||||||
|
|
||||||
std::filesystem::path unitTestData{getenv("_NIX_TEST_UNIT_DATA")};
|
std::filesystem::path unitTestData = nix::getUnitTestData();
|
||||||
|
|
||||||
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
|
|
@ -404,7 +405,7 @@ TEST_F(nix_api_store_test_base, nix_store_realise_invalid_system)
|
||||||
|
|
||||||
auto * store = open_local_store();
|
auto * store = open_local_store();
|
||||||
|
|
||||||
std::filesystem::path unitTestData{getenv("_NIX_TEST_UNIT_DATA")};
|
std::filesystem::path unitTestData = nix::getUnitTestData();
|
||||||
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << t.rdbuf();
|
buffer << t.rdbuf();
|
||||||
|
|
@ -449,7 +450,7 @@ TEST_F(nix_api_store_test_base, nix_store_realise_builder_fails)
|
||||||
|
|
||||||
auto * store = open_local_store();
|
auto * store = open_local_store();
|
||||||
|
|
||||||
std::filesystem::path unitTestData{getenv("_NIX_TEST_UNIT_DATA")};
|
std::filesystem::path unitTestData = nix::getUnitTestData();
|
||||||
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << t.rdbuf();
|
buffer << t.rdbuf();
|
||||||
|
|
@ -494,7 +495,7 @@ TEST_F(nix_api_store_test_base, nix_store_realise_builder_no_output)
|
||||||
|
|
||||||
auto * store = open_local_store();
|
auto * store = open_local_store();
|
||||||
|
|
||||||
std::filesystem::path unitTestData{getenv("_NIX_TEST_UNIT_DATA")};
|
std::filesystem::path unitTestData = nix::getUnitTestData();
|
||||||
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
std::ifstream t{unitTestData / "derivation/ca/self-contained.json"};
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << t.rdbuf();
|
buffer << t.rdbuf();
|
||||||
|
|
@ -870,7 +871,7 @@ TEST_F(NixApiStoreTestWithRealisedPath, nix_store_get_fs_closure_error_propagati
|
||||||
*/
|
*/
|
||||||
static std::string load_json_from_test_data(const char * filename)
|
static std::string load_json_from_test_data(const char * filename)
|
||||||
{
|
{
|
||||||
std::filesystem::path unitTestData{getenv("_NIX_TEST_UNIT_DATA")};
|
std::filesystem::path unitTestData = nix::getUnitTestData();
|
||||||
std::ifstream t{unitTestData / filename};
|
std::ifstream t{unitTestData / filename};
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << t.rdbuf();
|
buffer << t.rdbuf();
|
||||||
|
|
|
||||||
|
|
@ -4,20 +4,11 @@
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "nix/util/types.hh"
|
#include "nix/util/types.hh"
|
||||||
#include "nix/util/environment-variables.hh"
|
|
||||||
#include "nix/util/file-system.hh"
|
#include "nix/util/file-system.hh"
|
||||||
|
#include "nix/util/tests/test-data.hh"
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
/**
|
|
||||||
* The path to the unit test data directory. See the contributing guide
|
|
||||||
* in the manual for further details.
|
|
||||||
*/
|
|
||||||
static inline std::filesystem::path getUnitTestData()
|
|
||||||
{
|
|
||||||
return getEnv("_NIX_TEST_UNIT_DATA").value();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether we should update "golden masters" instead of running tests
|
* Whether we should update "golden masters" instead of running tests
|
||||||
* against them. See the contributing guide in the manual for further
|
* against them. See the contributing guide in the manual for further
|
||||||
|
|
|
||||||
|
|
@ -10,4 +10,5 @@ headers = files(
|
||||||
'json-characterization.hh',
|
'json-characterization.hh',
|
||||||
'nix_api_util.hh',
|
'nix_api_util.hh',
|
||||||
'string_callback.hh',
|
'string_callback.hh',
|
||||||
|
'test-data.hh',
|
||||||
)
|
)
|
||||||
|
|
|
||||||
24
src/libutil-test-support/include/nix/util/tests/test-data.hh
Normal file
24
src/libutil-test-support/include/nix/util/tests/test-data.hh
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
#pragma once
|
||||||
|
///@file
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
#include "nix/util/environment-variables.hh"
|
||||||
|
#include "nix/util/error.hh"
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The path to the unit test data directory. See the contributing guide
|
||||||
|
* in the manual for further details.
|
||||||
|
*/
|
||||||
|
static inline std::filesystem::path getUnitTestData()
|
||||||
|
{
|
||||||
|
auto data = getEnv("_NIX_TEST_UNIT_DATA");
|
||||||
|
if (!data)
|
||||||
|
throw Error(
|
||||||
|
"_NIX_TEST_UNIT_DATA environment variable is not set. "
|
||||||
|
"Recommendation: use meson, example: 'meson test -C build --gdb'");
|
||||||
|
return std::filesystem::path(*data);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace nix
|
||||||
|
|
@ -613,6 +613,8 @@ static void main_nix_build(int argc, char ** argv)
|
||||||
environment variables and shell functions. Also don't
|
environment variables and shell functions. Also don't
|
||||||
lose the current $PATH directories. */
|
lose the current $PATH directories. */
|
||||||
auto rcfile = (tmpDir.path() / "rc").string();
|
auto rcfile = (tmpDir.path() / "rc").string();
|
||||||
|
auto tz = getEnv("TZ");
|
||||||
|
auto tzExport = tz ? "export TZ=" + escapeShellArgAlways(*tz) + "; " : "";
|
||||||
std::string rc = fmt(
|
std::string rc = fmt(
|
||||||
(R"(_nix_shell_clean_tmpdir() { command rm -rf %1%; };)"s
|
(R"(_nix_shell_clean_tmpdir() { command rm -rf %1%; };)"s
|
||||||
"trap _nix_shell_clean_tmpdir EXIT; "
|
"trap _nix_shell_clean_tmpdir EXIT; "
|
||||||
|
|
@ -646,7 +648,7 @@ static void main_nix_build(int argc, char ** argv)
|
||||||
(pure ? "" : "PATH=$PATH:$p; unset p; "),
|
(pure ? "" : "PATH=$PATH:$p; unset p; "),
|
||||||
escapeShellArgAlways(dirOf(*shell)),
|
escapeShellArgAlways(dirOf(*shell)),
|
||||||
escapeShellArgAlways(*shell),
|
escapeShellArgAlways(*shell),
|
||||||
(getenv("TZ") ? (std::string("export TZ=") + escapeShellArgAlways(getenv("TZ")) + "; ") : ""),
|
tzExport,
|
||||||
envCommand);
|
envCommand);
|
||||||
vomit("Sourcing nix-shell with file %s and contents:\n%s", rcfile, rc);
|
vomit("Sourcing nix-shell with file %s and contents:\n%s", rcfile, rc);
|
||||||
writeFile(rcfile, rc);
|
writeFile(rcfile, rc);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue