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…
	
	Add table
		Add a link
		
	
		Reference in a new issue