aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorDavid McFarland <corngood@gmail.com>2017-06-20 09:10:10 -0300
committerDavid McFarland <corngood@gmail.com>2017-06-20 10:59:13 -0300
commit596b0e0a045eb953b5ed3328d5ae8eb636e31373 (patch)
tree4f1e98c423ac78ddf8d954111dea95d62bce5fc5 /src/libstore
parentc7346a275c4cdcb59b3961241ddc52b79452d716 (diff)
Call SetDllDirectory("") after sqlite3 init on cygwin
Cygwin sqlite3 is patched to call SetDllDirectory("/usr/bin") on init, which affects the current process and is inherited by child processes. It causes DLLs to be loaded from /usr/bin/ before $PATH, which breaks all sorts of things. A typical failures would be header/lib version mismatches (e.g. openssl when running checkPhase on openssh). We'll just set it back to the default value. Note that this is a problem with the cygwin version of sqlite3 (currently 3.18.0). nixpkgs doesn't have the problematic patch.
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/local-store.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 74c74e672..c76294dcc 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -30,6 +30,10 @@
#include <sys/xattr.h>
#endif
+#ifdef __CYGWIN__
+#include <windows.h>
+#endif
+
#include <sqlite3.h>
@@ -281,6 +285,16 @@ void LocalStore::openDB(State & state, bool create)
SQLITE_OPEN_READWRITE | (create ? SQLITE_OPEN_CREATE : 0), 0) != SQLITE_OK)
throw Error(format("cannot open Nix database ‘%1%’") % dbPath);
+#ifdef __CYGWIN__
+ /* The cygwin version of sqlite3 has a patch which calls
+ SetDllDirectory("/usr/bin") on init. It was intended to fix extension
+ loading, which we don't use, and the effect of SetDllDirectory is
+ inherited by child processes, and causes libraries to be loaded from
+ /usr/bin instead of $PATH. This breaks quite a few things (e.g.
+ checkPhase on openssh), so we set it back to default behaviour. */
+ SetDllDirectoryW(L"");
+#endif
+
if (sqlite3_busy_timeout(db, 60 * 60 * 1000) != SQLITE_OK)
throwSQLiteError(db, "setting timeout");