aboutsummaryrefslogtreecommitdiff
path: root/gnu/packages/patches/icecat-CVE-2015-0836-pt-10.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/patches/icecat-CVE-2015-0836-pt-10.patch')
-rw-r--r--gnu/packages/patches/icecat-CVE-2015-0836-pt-10.patch219
1 files changed, 219 insertions, 0 deletions
diff --git a/gnu/packages/patches/icecat-CVE-2015-0836-pt-10.patch b/gnu/packages/patches/icecat-CVE-2015-0836-pt-10.patch
new file mode 100644
index 0000000000..9a4668b2dc
--- /dev/null
+++ b/gnu/packages/patches/icecat-CVE-2015-0836-pt-10.patch
@@ -0,0 +1,219 @@
+From 66e65b2138c6db20288ef4cf78d15995f382a7e2 Mon Sep 17 00:00:00 2001
+From: Kartikaya Gupta <kgupta@mozilla.com>
+Date: Tue, 13 Jan 2015 13:26:26 -0500
+Subject: [PATCH] Bug 1107009. r=BenWa, a=sledru
+
+---
+ gfx/layers/ipc/CompositorParent.cpp | 57 ++++++++++++++++++++++++++++++-------
+ 1 file changed, 46 insertions(+), 11 deletions(-)
+
+diff --git a/gfx/layers/ipc/CompositorParent.cpp b/gfx/layers/ipc/CompositorParent.cpp
+index ce50277..cbbb2ef 100644
+--- a/gfx/layers/ipc/CompositorParent.cpp
++++ b/gfx/layers/ipc/CompositorParent.cpp
+@@ -22,6 +22,7 @@
+ #include "gfxPrefs.h" // for gfxPrefs
+ #include "ipc/ShadowLayersManager.h" // for ShadowLayersManager
+ #include "mozilla/AutoRestore.h" // for AutoRestore
++#include "mozilla/ClearOnShutdown.h" // for ClearOnShutdown
+ #include "mozilla/DebugOnly.h" // for DebugOnly
+ #include "mozilla/gfx/2D.h" // for DrawTarget
+ #include "mozilla/gfx/Point.h" // for IntSize
+@@ -70,6 +71,16 @@ CompositorParent::LayerTreeState::LayerTreeState()
+
+ typedef map<uint64_t, CompositorParent::LayerTreeState> LayerTreeMap;
+ static LayerTreeMap sIndirectLayerTrees;
++static StaticAutoPtr<mozilla::Monitor> sIndirectLayerTreesLock;
++
++static void EnsureLayerTreeMapReady()
++{
++ MOZ_ASSERT(NS_IsMainThread());
++ if (!sIndirectLayerTreesLock) {
++ sIndirectLayerTreesLock = new Monitor("IndirectLayerTree");
++ mozilla::ClearOnShutdown(&sIndirectLayerTreesLock);
++ }
++}
+
+ // FIXME/bug 774386: we're assuming that there's only one
+ // CompositorParent, but that's not always true. This assumption only
+@@ -132,6 +143,7 @@ void CompositorParent::StartUp()
+ return;
+ }
+ MOZ_ASSERT(!sCompositorLoop);
++ EnsureLayerTreeMapReady();
+ CreateCompositorMap();
+ CreateThread();
+ sMainLoop = MessageLoop::current();
+@@ -206,7 +218,11 @@ CompositorParent::CompositorParent(nsIWidget* aWidget,
+ this, &mCompositorID));
+
+ mRootLayerTreeID = AllocateLayerTreeId();
+- sIndirectLayerTrees[mRootLayerTreeID].mParent = this;
++
++ { // scope lock
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
++ sIndirectLayerTrees[mRootLayerTreeID].mParent = this;
++ }
+
+ mApzcTreeManager = new APZCTreeManager();
+ ++sCompositorThreadRefCount;
+@@ -249,7 +265,10 @@ CompositorParent::Destroy()
+ mCompositionManager = nullptr;
+ mApzcTreeManager->ClearTree();
+ mApzcTreeManager = nullptr;
+- sIndirectLayerTrees.erase(mRootLayerTreeID);
++ { // scope lock
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
++ sIndirectLayerTrees.erase(mRootLayerTreeID);
++ }
+ }
+
+ void
+@@ -266,6 +285,7 @@ CompositorParent::RecvWillStop()
+
+ // Ensure that the layer manager is destroyed before CompositorChild.
+ if (mLayerManager) {
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ for (LayerTreeMap::iterator it = sIndirectLayerTrees.begin();
+ it != sIndirectLayerTrees.end(); it++)
+ {
+@@ -380,7 +400,10 @@ CompositorParent::ActorDestroy(ActorDestroyReason why)
+ if (mLayerManager) {
+ mLayerManager->Destroy();
+ mLayerManager = nullptr;
+- sIndirectLayerTrees[mRootLayerTreeID].mLayerManager = nullptr;
++ { // scope lock
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
++ sIndirectLayerTrees[mRootLayerTreeID].mLayerManager = nullptr;
++ }
+ mCompositionManager = nullptr;
+ mCompositor = nullptr;
+ }
+@@ -696,6 +719,7 @@ CompositorParent::DidComposite()
+ {
+ unused << SendDidComposite(0);
+
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ for (LayerTreeMap::iterator it = sIndirectLayerTrees.begin();
+ it != sIndirectLayerTrees.end(); it++) {
+ LayerTreeState* lts = &it->second;
+@@ -867,6 +891,7 @@ CompositorParent::InitializeLayerManager(const nsTArray<LayersBackend>& aBackend
+ mLayerManager = layerManager;
+ MOZ_ASSERT(compositor);
+ mCompositor = compositor;
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ sIndirectLayerTrees[mRootLayerTreeID].mLayerManager = layerManager;
+ return;
+ }
+@@ -969,6 +994,7 @@ CompositorParent::RecvNotifyChildCreated(const uint64_t& child)
+ void
+ CompositorParent::NotifyChildCreated(uint64_t aChild)
+ {
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ sIndirectLayerTrees[aChild].mParent = this;
+ sIndirectLayerTrees[aChild].mLayerManager = mLayerManager;
+ }
+@@ -985,6 +1011,7 @@ CompositorParent::AllocateLayerTreeId()
+ static void
+ EraseLayerState(uint64_t aId)
+ {
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ sIndirectLayerTrees.erase(aId);
+ }
+
+@@ -1001,6 +1028,7 @@ UpdateControllerForLayersId(uint64_t aLayersId,
+ GeckoContentController* aController)
+ {
+ // Adopt ref given to us by SetControllerForLayerTree()
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ sIndirectLayerTrees[aLayersId].mController =
+ already_AddRefed<GeckoContentController>(aController);
+ }
+@@ -1010,12 +1038,15 @@ ScopedLayerTreeRegistration::ScopedLayerTreeRegistration(uint64_t aLayersId,
+ GeckoContentController* aController)
+ : mLayersId(aLayersId)
+ {
++ EnsureLayerTreeMapReady();
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ sIndirectLayerTrees[aLayersId].mRoot = aRoot;
+ sIndirectLayerTrees[aLayersId].mController = aController;
+ }
+
+ ScopedLayerTreeRegistration::~ScopedLayerTreeRegistration()
+ {
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ sIndirectLayerTrees.erase(mLayersId);
+ }
+
+@@ -1175,6 +1206,7 @@ CompositorParent::CloneToplevel(const InfallibleTArray<mozilla::ipc::ProtocolFdM
+ static void
+ UpdateIndirectTree(uint64_t aId, Layer* aRoot, const TargetConfig& aTargetConfig)
+ {
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ sIndirectLayerTrees[aId].mRoot = aRoot;
+ sIndirectLayerTrees[aId].mTargetConfig = aTargetConfig;
+ }
+@@ -1182,6 +1214,7 @@ UpdateIndirectTree(uint64_t aId, Layer* aRoot, const TargetConfig& aTargetConfig
+ /* static */ const CompositorParent::LayerTreeState*
+ CompositorParent::GetIndirectShadowTree(uint64_t aId)
+ {
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ LayerTreeMap::const_iterator cit = sIndirectLayerTrees.find(aId);
+ if (sIndirectLayerTrees.end() == cit) {
+ return nullptr;
+@@ -1189,12 +1222,6 @@ CompositorParent::GetIndirectShadowTree(uint64_t aId)
+ return &cit->second;
+ }
+
+-static void
+-RemoveIndirectTree(uint64_t aId)
+-{
+- sIndirectLayerTrees.erase(aId);
+-}
+-
+ void
+ CrossProcessCompositorParent::ActorDestroy(ActorDestroyReason aWhy)
+ {
+@@ -1211,6 +1238,8 @@ CrossProcessCompositorParent::AllocPLayerTransactionParent(const nsTArray<Layers
+ {
+ MOZ_ASSERT(aId != 0);
+
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
++
+ if (sIndirectLayerTrees[aId].mLayerManager) {
+ sIndirectLayerTrees[aId].mCrossProcessParent = this;
+ LayerManagerComposite* lm = sIndirectLayerTrees[aId].mLayerManager;
+@@ -1234,7 +1263,7 @@ bool
+ CrossProcessCompositorParent::DeallocPLayerTransactionParent(PLayerTransactionParent* aLayers)
+ {
+ LayerTransactionParent* slp = static_cast<LayerTransactionParent*>(aLayers);
+- RemoveIndirectTree(slp->GetId());
++ EraseLayerState(slp->GetId());
+ static_cast<LayerTransactionParent*>(aLayers)->ReleaseIPDLReference();
+ return true;
+ }
+@@ -1242,6 +1271,7 @@ CrossProcessCompositorParent::DeallocPLayerTransactionParent(PLayerTransactionPa
+ bool
+ CrossProcessCompositorParent::RecvNotifyChildCreated(const uint64_t& child)
+ {
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
+ sIndirectLayerTrees[child].mParent->NotifyChildCreated(child);
+ return true;
+ }
+@@ -1269,7 +1299,12 @@ CrossProcessCompositorParent::ForceComposite(LayerTransactionParent* aLayerTree)
+ {
+ uint64_t id = aLayerTree->GetId();
+ MOZ_ASSERT(id != 0);
+- sIndirectLayerTrees[id].mParent->ForceComposite(aLayerTree);
++ CompositorParent* parent;
++ { // scope lock
++ MonitorAutoLock lock(*sIndirectLayerTreesLock);
++ parent = sIndirectLayerTrees[id].mParent;
++ }
++ parent->ForceComposite(aLayerTree);
+ }
+
+ bool
+--
+2.2.1
+