Bug 1288909, part 4 - Use a strong reference to the set in ClassInfo2NativeSetMap. r=billm

Entries should end up getting cleared out from this table before the
value dies, so let's just make the reference strong so that any
mistakes will result in leaks and not use-after-frees.

Using smart pointer classes with PLDHashtable is a little
questionable, and I don't want to convert this one hash table to
nsTHashtable, so I use manual addref and release.

MozReview-Commit-ID: Kfg9veS6r11

--HG--
extra : rebase_source : 865ab48c2cf67546dd705cf79f8873efe695ac5c
This commit is contained in:
Andrew McCreight 2016-09-06 12:58:27 -07:00
parent 946ffa2384
commit 51db16e7f5
2 changed files with 35 additions and 3 deletions

View File

@ -201,6 +201,33 @@ IID2NativeInterfaceMap::SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf)
/***************************************************************************/
// implement ClassInfo2NativeSetMap...
// static
bool ClassInfo2NativeSetMap::Entry::Match(const PLDHashEntryHdr* aEntry,
const void* aKey)
{
return static_cast<const Entry*>(aEntry)->key == aKey;
}
// static
void ClassInfo2NativeSetMap::Entry::Clear(PLDHashTable* aTable,
PLDHashEntryHdr* aEntry)
{
auto entry = static_cast<Entry*>(aEntry);
NS_RELEASE(entry->value);
entry->key = nullptr;
entry->value = nullptr;
}
const PLDHashTableOps ClassInfo2NativeSetMap::Entry::sOps =
{
PLDHashTable::HashVoidPtrKeyStub,
Match,
PLDHashTable::MoveEntryStub,
Clear,
nullptr
};
// static
ClassInfo2NativeSetMap*
ClassInfo2NativeSetMap::newMap(int length)
@ -209,7 +236,7 @@ ClassInfo2NativeSetMap::newMap(int length)
}
ClassInfo2NativeSetMap::ClassInfo2NativeSetMap(int length)
: mTable(PLDHashTable::StubOps(), sizeof(Entry), length)
: mTable(&ClassInfo2NativeSetMap::Entry::sOps, sizeof(Entry), length)
{
}

View File

@ -278,7 +278,12 @@ public:
struct Entry : public PLDHashEntryHdr
{
nsIClassInfo* key;
XPCNativeSet* value;
XPCNativeSet* value; // strong reference
static const PLDHashTableOps sOps;
private:
static bool Match(const PLDHashEntryHdr* aEntry, const void* aKey);
static void Clear(PLDHashTable* aTable, PLDHashEntryHdr* aEntry);
};
static ClassInfo2NativeSetMap* newMap(int length);
@ -298,7 +303,7 @@ public:
if (entry->key)
return entry->value;
entry->key = info;
entry->value = set;
NS_ADDREF(entry->value = set);
return set;
}