Просмотр исходного кода

Merge remote branch 'public/bug1954' into maint-0.2.2

Nick Mathewson 13 лет назад
Родитель
Сommit
e385961542
6 измененных файлов с 41 добавлено и 4 удалено
  1. 4 0
      changes/bug1954_loadlib
  2. 15 0
      src/common/util.c
  3. 4 0
      src/common/util.h
  4. 1 2
      src/or/eventdns.c
  5. 1 2
      src/or/ntmain.c
  6. 16 0
      src/test/test_util.c

+ 4 - 0
changes/bug1954_loadlib

@@ -0,0 +1,4 @@
+  o Major bugfixes
+    - Always search the windows system directory for system DLLs, and
+      nowhere else.  Fixes bug 1954.
+

+ 15 - 0
src/common/util.c

@@ -26,6 +26,7 @@
 #include <io.h>
 #include <direct.h>
 #include <process.h>
+#include <tchar.h>
 #else
 #include <dirent.h>
 #include <pwd.h>
@@ -2862,3 +2863,17 @@ write_pidfile(char *filename)
   }
 }
 
+#ifdef MS_WINDOWS
+HANDLE
+load_windows_system_library(const TCHAR *library_name)
+{
+  TCHAR path[MAX_PATH];
+  unsigned n;
+  n = GetSystemDirectory(path, MAX_PATH);
+  if (n == 0 || n + _tcslen(library_name) + 2 >= MAX_PATH)
+    return 0;
+  _tcscat(path, TEXT("\\"));
+  _tcscat(path, library_name);
+  return LoadLibrary(path);
+}
+#endif

+ 4 - 0
src/common/util.h

@@ -340,6 +340,10 @@ void start_daemon(void);
 void finish_daemon(const char *desired_cwd);
 void write_pidfile(char *filename);
 
+#ifdef MS_WINDOWS
+HANDLE load_windows_system_library(const TCHAR *library_name);
+#endif
+
 const char *libor_get_digests(void);
 
 #endif

+ 1 - 2
src/or/eventdns.c

@@ -3131,8 +3131,7 @@ load_nameservers_with_getnetworkparams(void)
 	IP_ADDR_STRING *ns;
 	GetNetworkParams_fn_t fn;
 
-	/* XXXX Possibly, we should hardcode the location of this DLL. */
-	if (!(handle = LoadLibrary(TEXT("iphlpapi.dll")))) {
+	if (!(handle = load_windows_system_library(TEXT("iphlpapi.dll")))) {
 		log(EVDNS_LOG_WARN, "Could not open iphlpapi.dll");
 		/* right now status = 0, doesn't that mean "good" - mikec */
 		status = -1;

+ 1 - 2
src/or/ntmain.c

@@ -138,8 +138,7 @@ nt_service_loadlibrary(void)
   if (service_fns.loaded)
     return;
 
-  /* XXXX Possibly, we should hardcode the location of this DLL. */
-  if (!(library = LoadLibrary(TEXT("advapi32.dll")))) {
+  if (!(library = load_windows_system_library(TEXT("advapi32.dll")))) {
     log_err(LD_GENERAL, "Couldn't open advapi32.dll.  Are you trying to use "
             "NT services on Windows 98? That doesn't work.");
     goto err;

+ 16 - 0
src/test/test_util.c

@@ -1195,6 +1195,19 @@ test_util_listdir(void *ptr)
   }
 }
 
+#ifdef MS_WINDOWS
+static void
+test_util_load_win_lib(void *ptr)
+{
+  HANDLE h = load_windows_system_library("advapi32.dll");
+
+  tt_assert(h);
+ done:
+  if (h)
+    CloseHandle(h);
+}
+#endif
+
 #define UTIL_LEGACY(name)                                               \
   { #name, legacy_test_helper, 0, &legacy_setup, test_util_ ## name }
 
@@ -1218,6 +1231,9 @@ struct testcase_t util_tests[] = {
   UTIL_TEST(find_str_at_start_of_line, 0),
   UTIL_TEST(asprintf, 0),
   UTIL_TEST(listdir, 0),
+#ifdef MS_WINDOWS
+  UTIL_TEST(load_win_lib, 0),
+#endif
   END_OF_TESTCASES
 };