[tor-commits] [tor-browser/tor-browser-31.2.0esr-4.5-1] Bug 13594: Windows updater depends on msvcr100.dll

mikeperry at torproject.org mikeperry at torproject.org
Wed Nov 5 02:40:47 UTC 2014


commit a9ccc52a47abcb55a1b39ca7aeb066dfcc861549
Author: Kathy Brade <brade at pearlcrescent.com>
Date:   Tue Nov 4 10:53:58 2014 -0500

    Bug 13594: Windows updater depends on msvcr100.dll
    
    On Windows, updater.exe failed to start if a copy of msvcr100.dll was not
    installed in the system directory.  We now append to the PATH the directory
    that contains our copy of msvcr100.dll; that is, the Browser/ directory that
    contains firefox.exe.  That same directory contains a copy of libssp-0.dll,
    which updater.exe also depends on; both DLL dependencies are now satisfied
    from the Browser/ directory.  Previously, the libssp-0.dll dependency was being
    satisifed from the .../Browser/TorBrowser/Tor directory which Tor Launcher
    adds to the path (and typically the updater is run from within a browser
    session or after a restart during which the PATH is preserved).
---
 toolkit/xre/nsUpdateDriver.cpp |   46 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/toolkit/xre/nsUpdateDriver.cpp b/toolkit/xre/nsUpdateDriver.cpp
index f398aed..1188736 100644
--- a/toolkit/xre/nsUpdateDriver.cpp
+++ b/toolkit/xre/nsUpdateDriver.cpp
@@ -39,6 +39,7 @@
 # include <windows.h>
 # include <shlwapi.h>
 # include "nsWindowsHelpers.h"
+# include "prprf.h"
 # define getcwd(path, size) _getcwd(path, size)
 # define getpid() GetCurrentProcessId()
 #elif defined(XP_UNIX)
@@ -133,6 +134,36 @@ GetCurrentWorkingDir(char *buf, size_t size)
 }
 
 
+#if defined(XP_WIN)
+#define PATH_SEPARATOR ";"
+
+// In Tor Browser, updater.exe depends on some DLLs that are located in the
+// app directory.  To allow the updater to run when it has been copied into
+// the update directory, we append the app directory to the PATH.
+static nsresult
+AdjustPathForUpdater(nsIFile *appDir)
+{
+  nsAutoCString appPath;
+  nsresult rv = appDir->GetNativePath(appPath);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  char *s = nullptr;
+  char *pathValue = PR_GetEnv("PATH");
+  if ((nullptr == pathValue) || ('\0' == *pathValue)) {
+    s = PR_smprintf("PATH=%s", appPath.get());
+  } else {
+    s = PR_smprintf("PATH=%s" PATH_SEPARATOR "%s", pathValue, appPath.get());
+  }
+
+  // We intentionally leak the value that is passed into PR_SetEnv() because
+  // the environment will hold a pointer to it.
+  if ((nullptr == s) || (PR_SUCCESS != PR_SetEnv(s)))
+    return NS_ERROR_FAILURE;
+
+  return NS_OK;
+}
+#endif
+
 #ifdef DEBUG
 static void
 dump_argv(const char *aPrefix, char **argv, int argc)
@@ -592,6 +623,13 @@ SwitchToUpdatedApp(nsIFile *greDir, nsIFile *updateDir, nsIFile *statusFile,
     PR_SetEnv("MOZ_SAFE_MODE_RESTART=1");
   }
 
+#if defined(XP_WIN)
+  nsresult rv2 = AdjustPathForUpdater(appDir);
+  if (NS_FAILED(rv2)) {
+    LOG(("SwitchToUpdatedApp -- AdjustPathForUpdater failed (0x%x)\n", rv2));
+  }
+#endif
+
   LOG(("spawning updater process for replacing [%s]\n", updaterPath.get()));
 
 #if defined(USE_EXECV)
@@ -881,6 +919,14 @@ ApplyUpdate(nsIFile *greDir, nsIFile *updateDir, nsIFile *statusFile,
   if (isOSUpdate) {
     PR_SetEnv("MOZ_OS_UPDATE=1");
   }
+
+#if defined(XP_WIN)
+  nsresult rv2 = AdjustPathForUpdater(appDir);
+  if (NS_FAILED(rv2)) {
+    LOG(("ApplyUpdate -- AdjustPathForUpdater failed (0x%x)\n", rv2));
+  }
+#endif
+
 #if defined(MOZ_WIDGET_GONK)
   // We want the updater to be CPU friendly and not subject to being killed by
   // the low memory killer, so we pass in some preferences to allow it to





More information about the tor-commits mailing list