guix-devel/gnu/packages/patches/icecat-CVE-2015-4513-pt02.p...

104 lines
3.6 KiB
Diff

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