summary refs log tree commit diff
path: root/gnu/packages/patches/icecat-CVE-2015-0815-pt2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/patches/icecat-CVE-2015-0815-pt2.patch')
-rw-r--r--gnu/packages/patches/icecat-CVE-2015-0815-pt2.patch89
1 files changed, 89 insertions, 0 deletions
diff --git a/gnu/packages/patches/icecat-CVE-2015-0815-pt2.patch b/gnu/packages/patches/icecat-CVE-2015-0815-pt2.patch
new file mode 100644
index 0000000000..0a0cbed177
--- /dev/null
+++ b/gnu/packages/patches/icecat-CVE-2015-0815-pt2.patch
@@ -0,0 +1,89 @@
+From f6d39ec03896eaf5d30d79d8165263c98e957749 Mon Sep 17 00:00:00 2001
+From: Nathan Froyd <froydnj@mozilla.com>
+Date: Fri, 6 Feb 2015 16:19:36 -0500
+Subject: [PATCH] Bug 1036515 - Narrow the scope of unlocking mMonitor in
+ nsTimerImpl::PostTimerEvents. r=bsmedberg, a=abillings
+
+---
+ xpcom/threads/TimerThread.cpp | 55 ++++++++++++++++++++++---------------------
+ 1 file changed, 28 insertions(+), 27 deletions(-)
+
+diff --git a/xpcom/threads/TimerThread.cpp b/xpcom/threads/TimerThread.cpp
+index bd586c9..b95846f 100644
+--- a/xpcom/threads/TimerThread.cpp
++++ b/xpcom/threads/TimerThread.cpp
+@@ -239,43 +239,44 @@ NS_IMETHODIMP TimerThread::Run()
+           RemoveTimerInternal(timer);
+           timer = nullptr;
+ 
++#ifdef DEBUG_TIMERS
++          if (PR_LOG_TEST(GetTimerLog(), PR_LOG_DEBUG)) {
++            PR_LOG(GetTimerLog(), PR_LOG_DEBUG,
++                   ("Timer thread woke up %fms from when it was supposed to\n",
++                    fabs((now - timerRef->mTimeout).ToMilliseconds())));
++          }
++#endif
++
+           {
+             // We release mMonitor around the Fire call to avoid deadlock.
+             MonitorAutoUnlock unlock(mMonitor);
+ 
+-#ifdef DEBUG_TIMERS
+-            if (PR_LOG_TEST(GetTimerLog(), PR_LOG_DEBUG)) {
+-              PR_LOG(GetTimerLog(), PR_LOG_DEBUG,
+-                     ("Timer thread woke up %fms from when it was supposed to\n",
+-                      fabs((now - timerRef->mTimeout).ToMilliseconds())));
+-            }
+-#endif
+ 
+             // We are going to let the call to PostTimerEvent here handle the
+             // release of the timer so that we don't end up releasing the timer
+             // on the TimerThread instead of on the thread it targets.
+             timerRef = nsTimerImpl::PostTimerEvent(timerRef.forget());
++          }
+ 
+-            if (timerRef) {
+-              // We got our reference back due to an error.
+-              // Unhook the nsRefPtr, and release manually so we can get the
+-              // refcount.
+-              nsrefcnt rc = timerRef.forget().take()->Release();
+-              (void)rc;
+-
+-              // The nsITimer interface requires that its users keep a reference
+-              // to the timers they use while those timers are initialized but
+-              // have not yet fired.  If this ever happens, it is a bug in the
+-              // code that created and used the timer.
+-              //
+-              // Further, note that this should never happen even with a
+-              // misbehaving user, because nsTimerImpl::Release checks for a
+-              // refcount of 1 with an armed timer (a timer whose only reference
+-              // is from the timer thread) and when it hits this will remove the
+-              // timer from the timer thread and thus destroy the last reference,
+-              // preventing this situation from occurring.
+-              MOZ_ASSERT(rc != 0, "destroyed timer off its target thread!");
+-            }
++          if (timerRef) {
++            // We got our reference back due to an error.
++            // Unhook the nsRefPtr, and release manually so we can get the
++            // refcount.
++            nsrefcnt rc = timerRef.forget().take()->Release();
++            (void)rc;
++
++            // The nsITimer interface requires that its users keep a reference
++            // to the timers they use while those timers are initialized but
++            // have not yet fired.  If this ever happens, it is a bug in the
++            // code that created and used the timer.
++            //
++            // Further, note that this should never happen even with a
++            // misbehaving user, because nsTimerImpl::Release checks for a
++            // refcount of 1 with an armed timer (a timer whose only reference
++            // is from the timer thread) and when it hits this will remove the
++            // timer from the timer thread and thus destroy the last reference,
++            // preventing this situation from occurring.
++            MOZ_ASSERT(rc != 0, "destroyed timer off its target thread!");
+           }
+ 
+           if (mShutdown)
+-- 
+2.2.1
+