Bug 211266 void nsHTMLEntities::AddRefTable doesn't check the return value of PL_DHashTableInit

r=axel sr=heikki


git-svn-id: svn://10.0.0.236/trunk@148880 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
timeless%mozdev.org
2003-11-05 22:11:55 +00:00
parent ed4db1d586
commit 83b15b1d1b
6 changed files with 92 additions and 70 deletions

View File

@@ -131,44 +131,51 @@ static const EntityNode gEntityArray[] = {
#define NS_HTML_ENTITY_COUNT ((PRInt32)NS_ARRAY_LENGTH(gEntityArray))
void
nsresult
nsHTMLEntities::AddRefTable(void)
{
if (++gTableRefCnt != 1)
return;
if (!gTableRefCnt) {
if (!PL_DHashTableInit(&gEntityToUnicode, &EntityToUnicodeOps,
nsnull, sizeof(EntityNodeEntry),
PRUint32(NS_HTML_ENTITY_COUNT / 0.75))) {
gEntityToUnicode.ops = nsnull;
return NS_ERROR_OUT_OF_MEMORY;
}
if (!PL_DHashTableInit(&gUnicodeToEntity, &UnicodeToEntityOps,
nsnull, sizeof(EntityNodeEntry),
PRUint32(NS_HTML_ENTITY_COUNT / 0.75))) {
PL_DHashTableFinish(&gEntityToUnicode);
gEntityToUnicode.ops = gUnicodeToEntity.ops = nsnull;
return NS_ERROR_OUT_OF_MEMORY;
}
for (const EntityNode *node = gEntityArray,
*node_end = gEntityArray + NS_ARRAY_LENGTH(gEntityArray);
node < node_end; ++node) {
PL_DHashTableInit(&gEntityToUnicode, &EntityToUnicodeOps,
nsnull, sizeof(EntityNodeEntry),
PRUint32(NS_HTML_ENTITY_COUNT / 0.75));
PL_DHashTableInit(&gUnicodeToEntity, &UnicodeToEntityOps,
nsnull, sizeof(EntityNodeEntry),
PRUint32(NS_HTML_ENTITY_COUNT / 0.75));
// add to Entity->Unicode table
EntityNodeEntry* entry =
NS_STATIC_CAST(EntityNodeEntry*,
PL_DHashTableOperate(&gEntityToUnicode,
node->mStr,
PL_DHASH_ADD));
NS_ASSERTION(entry, "Error adding an entry");
// Prefer earlier entries when we have duplication.
if (!entry->node)
entry->node = node;
for (const EntityNode *node = gEntityArray,
*node_end = gEntityArray + NS_ARRAY_LENGTH(gEntityArray);
node < node_end; ++node) {
EntityNodeEntry* entry;
// add to Entity->Unicode table
entry = NS_STATIC_CAST(EntityNodeEntry*,
PL_DHashTableOperate(&gEntityToUnicode,
node->mStr,
PL_DHASH_ADD));
NS_ASSERTION(entry, "Error adding an entry");
// Prefer earlier entries when we have duplication.
if (!entry->node)
entry->node = node;
// add to Unicode->Entity table
entry = NS_STATIC_CAST(EntityNodeEntry*,
PL_DHashTableOperate(&gUnicodeToEntity,
NS_INT32_TO_PTR(node->mUnicode),
PL_DHASH_ADD));
NS_ASSERTION(entry, "Error adding an entry");
// Prefer earlier entries when we have duplication.
if (!entry->node)
entry->node = node;
// add to Unicode->Entity table
entry = NS_STATIC_CAST(EntityNodeEntry*,
PL_DHashTableOperate(&gUnicodeToEntity,
NS_INT32_TO_PTR(node->mUnicode),
PL_DHASH_ADD));
NS_ASSERTION(entry, "Error adding an entry");
// Prefer earlier entries when we have duplication.
if (!entry->node)
entry->node = node;
}
}
++gTableRefCnt;
return NS_OK;
}
void

View File

@@ -43,7 +43,7 @@
class nsHTMLEntities {
public:
static void AddRefTable(void);
static nsresult AddRefTable(void);
static void ReleaseTable(void);
/**

View File

@@ -108,7 +108,11 @@ Initialize(nsIModule* aSelf)
nsresult rv = nsHTMLTags::AddRefTable();
NS_ENSURE_SUCCESS(rv, rv);
nsHTMLEntities::AddRefTable();
rv = nsHTMLEntities::AddRefTable();
if (NS_FAILED(rv)) {
nsHTMLTags::ReleaseTable();
return rv;
}
InitializeElementTable();
CNewlineToken::AllocNewline();
gInitialized = PR_TRUE;