[tbb-commits] [tor-browser/tor-browser-52.0.2esr-7.0-2] Bug 1335916 - Make sure the update driver only calls SetupMacCommandLine from the main thread. r=rstrong

gk at torproject.org gk at torproject.org
Thu Apr 13 14:14:32 UTC 2017


commit 899435e1997583bd01ab31e363fe3153486dd134
Author: Matt Howell <mhowell at mozilla.com>
Date:   Thu Feb 2 15:29:32 2017 -0800

    Bug 1335916 - Make sure the update driver only calls SetupMacCommandLine from the main thread. r=rstrong
    
    MozReview-Commit-ID: 9nOgB6z8ooE
    
    --HG--
    extra : rebase_source : 6a6a18f64297a0bd44e7d6f49b1812e035636e4c
---
 toolkit/xre/nsUpdateDriver.cpp | 32 ++++++++++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/toolkit/xre/nsUpdateDriver.cpp b/toolkit/xre/nsUpdateDriver.cpp
index a9dbeff..7af085a 100644
--- a/toolkit/xre/nsUpdateDriver.cpp
+++ b/toolkit/xre/nsUpdateDriver.cpp
@@ -32,6 +32,7 @@
 #include "nsCommandLineServiceMac.h"
 #include "MacLaunchHelper.h"
 #include "updaterfileutils_osx.h"
+#include "mozilla/Monitor.h"
 #endif
 
 #if defined(XP_WIN)
@@ -91,6 +92,33 @@ static const int  kAppUpdaterIOPrioClassDefault = IOPRIO_CLASS_IDLE;
 static const int  kAppUpdaterIOPrioLevelDefault = 0;      // Doesn't matter for CLASS IDLE
 #endif
 
+#ifdef XP_MACOSX
+static void
+UpdateDriverSetupMacCommandLine(int& argc, char**& argv, bool restart)
+{
+  if (NS_IsMainThread()) {
+    CommandLineServiceMac::SetupMacCommandLine(argc, argv, restart);
+    return;
+  }
+  // Bug 1335916: SetupMacCommandLine calls a CoreFoundation function that
+  // asserts that it was called from the main thread, so if we are not the main
+  // thread, we have to dispatch that call to there. But we also have to get the
+  // result from it, so we can't just dispatch and return, we have to wait
+  // until the dispatched operation actually completes. So we also set up a
+  // monitor to signal us when that happens, and block until then.
+  Monitor monitor("nsUpdateDriver SetupMacCommandLine");
+
+  NS_DispatchToMainThread(
+    NS_NewRunnableFunction([&argc, &argv, restart, &monitor]() -> void
+    {
+      CommandLineServiceMac::SetupMacCommandLine(argc, argv, restart);
+      MonitorAutoLock(monitor).Notify();
+    }));
+
+  MonitorAutoLock(monitor).Wait();
+}
+#endif
+
 static nsresult
 GetCurrentWorkingDir(char *buf, size_t size)
 {
@@ -735,7 +763,7 @@ SwitchToUpdatedApp(nsIFile *greDir, nsIFile *updateDir,
   }
   _exit(0);
 #elif defined(XP_MACOSX)
-  CommandLineServiceMac::SetupMacCommandLine(argc, argv, true);
+  UpdateDriverSetupMacCommandLine(argc, argv, true);
   LaunchChildMac(argc, argv);
   exit(0);
 #else
@@ -1072,7 +1100,7 @@ ApplyUpdate(nsIFile *greDir, nsIFile *updateDir, nsIFile *statusFile,
     _exit(0);
   }
 #elif defined(XP_MACOSX)
-  CommandLineServiceMac::SetupMacCommandLine(argc, argv, restart);
+  UpdateDriverSetupMacCommandLine(argc, argv, restart);
 #ifdef DEBUG
   dump_argv("ApplyUpdate after SetupMacCommandLine", argv, argc);
 #endif





More information about the tbb-commits mailing list