summary refs log tree commit diff
path: root/gnu/packages/patches/icecat-CVE-2015-4513-pt02.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/patches/icecat-CVE-2015-4513-pt02.patch')
-rw-r--r--gnu/packages/patches/icecat-CVE-2015-4513-pt02.patch103
1 files changed, 103 insertions, 0 deletions
diff --git a/gnu/packages/patches/icecat-CVE-2015-4513-pt02.patch b/gnu/packages/patches/icecat-CVE-2015-4513-pt02.patch
new file mode 100644
index 0000000000..9a77ed908b
--- /dev/null
+++ b/gnu/packages/patches/icecat-CVE-2015-4513-pt02.patch
@@ -0,0 +1,103 @@
+From d463cb5f0374bfc7c62ae5f1c89edd3ca35084e5 Mon Sep 17 00:00:00 2001
+From: Olli Pettay <Olli.Pettay@helsinki.fi>
+Date: Thu, 24 Sep 2015 03:53:31 +0300
+Subject: [PATCH] Bug 1204669 - optimize out hashtable lookups caused by extra
+ GetPrototypeBinding call, r=bz,waldo, a=al
+
+--HG--
+extra : source : 91657db26f49f885f2338cb8c9302cdf18999f1f
+---
+ dom/xbl/nsXBLPrototypeBinding.h | 9 +++++++--
+ dom/xbl/nsXBLService.cpp        | 6 +++---
+ mfbt/WeakPtr.h                  | 8 +++++++-
+ 3 files changed, 17 insertions(+), 6 deletions(-)
+
+diff --git a/dom/xbl/nsXBLPrototypeBinding.h b/dom/xbl/nsXBLPrototypeBinding.h
+index be2cb5a..1aaa07f 100644
+--- a/dom/xbl/nsXBLPrototypeBinding.h
++++ b/dom/xbl/nsXBLPrototypeBinding.h
+@@ -17,6 +17,7 @@
+ #include "nsXBLProtoImplMethod.h"
+ #include "nsXBLPrototypeHandler.h"
+ #include "nsXBLPrototypeResources.h"
++#include "mozilla/WeakPtr.h"
+ 
+ class nsIAtom;
+ class nsIContent;
+@@ -35,9 +36,12 @@ class CSSStyleSheet;
+ // Instances of this class are owned by the nsXBLDocumentInfo object returned
+ // by XBLDocumentInfo().  Consumers who want to refcount things should refcount
+ // that.
+-class nsXBLPrototypeBinding final
++class nsXBLPrototypeBinding final :
++  public mozilla::SupportsWeakPtr<nsXBLPrototypeBinding>
+ {
+ public:
++  MOZ_DECLARE_WEAKREFERENCE_TYPENAME(nsXBLPrototypeBinding)
++
+   nsIContent* GetBindingElement() const { return mBinding; }
+   void SetBindingElement(nsIContent* aElement);
+ 
+@@ -289,7 +293,8 @@ protected:
+   nsXBLProtoImpl* mImplementation; // Our prototype implementation (includes methods, properties, fields,
+                                    // the constructor, and the destructor).
+ 
+-  nsXBLPrototypeBinding* mBaseBinding; // Weak.  The docinfo will own our base binding.
++  // Weak.  The docinfo will own our base binding.
++  mozilla::WeakPtr<nsXBLPrototypeBinding> mBaseBinding;
+   bool mInheritStyle;
+   bool mCheckedBaseProto;
+   bool mKeyHandlersRegistered;
+diff --git a/dom/xbl/nsXBLService.cpp b/dom/xbl/nsXBLService.cpp
+index 2204520..978c6fc 100644
+--- a/dom/xbl/nsXBLService.cpp
++++ b/dom/xbl/nsXBLService.cpp
+@@ -732,7 +732,8 @@ nsXBLService::GetBinding(nsIContent* aBoundElement, nsIURI* aURI,
+   if (!docInfo)
+     return NS_ERROR_FAILURE;
+ 
+-  nsXBLPrototypeBinding* protoBinding = docInfo->GetPrototypeBinding(ref);
++  WeakPtr<nsXBLPrototypeBinding> protoBinding =
++    docInfo->GetPrototypeBinding(ref);
+ 
+   if (!protoBinding) {
+ #ifdef DEBUG
+@@ -783,7 +784,7 @@ nsXBLService::GetBinding(nsIContent* aBoundElement, nsIURI* aURI,
+   NS_ENSURE_SUCCESS(rv, rv);
+ 
+   nsCOMPtr<nsIURI> baseBindingURI;
+-  nsXBLPrototypeBinding* baseProto = protoBinding->GetBasePrototype();
++  WeakPtr<nsXBLPrototypeBinding> baseProto = protoBinding->GetBasePrototype();
+   if (baseProto) {
+     baseBindingURI = baseProto->BindingURI();
+   }
+@@ -828,7 +829,6 @@ nsXBLService::GetBinding(nsIContent* aBoundElement, nsIURI* aURI,
+ 
+   if (!aPeekOnly) {
+     // Make a new binding
+-    protoBinding = docInfo->GetPrototypeBinding(ref);
+     NS_ENSURE_STATE(protoBinding);
+     nsXBLBinding *newBinding = new nsXBLBinding(protoBinding);
+ 
+diff --git a/mfbt/WeakPtr.h b/mfbt/WeakPtr.h
+index 6e5de43..22ba20e 100644
+--- a/mfbt/WeakPtr.h
++++ b/mfbt/WeakPtr.h
+@@ -172,7 +172,13 @@ public:
+ 
+   WeakPtr& operator=(T* aOther)
+   {
+-    return *this = aOther->SelfReferencingWeakPtr();
++    if (aOther) {
++      *this = aOther->SelfReferencingWeakPtr();
++    } else if (!mRef || mRef->get()) {
++      // Ensure that mRef is dereferenceable in the uninitialized state.
++      mRef = new WeakReference(nullptr);
++    }
++    return *this;
+   }
+ 
+   MOZ_IMPLICIT WeakPtr(T* aOther)
+-- 
+2.5.0
+