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.
This commit is contained in:
parent
c7346a275c
commit
596b0e0a04
1 changed files with 14 additions and 0 deletions
|
@ -30,6 +30,10 @@
|
||||||
#include <sys/xattr.h>
|
#include <sys/xattr.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <sqlite3.h>
|
#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)
|
SQLITE_OPEN_READWRITE | (create ? SQLITE_OPEN_CREATE : 0), 0) != SQLITE_OK)
|
||||||
throw Error(format("cannot open Nix database ‘%1%’") % dbPath);
|
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)
|
if (sqlite3_busy_timeout(db, 60 * 60 * 1000) != SQLITE_OK)
|
||||||
throwSQLiteError(db, "setting timeout");
|
throwSQLiteError(db, "setting timeout");
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue