summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkwaclaw <kwaclaw>2012-03-10 17:40:30 +0000
committerkwaclaw <kwaclaw>2012-03-10 17:40:30 +0000
commit5d6dba5218bc4e04ff121cf5d54564d3fbd84870 (patch)
tree910aa876b99c487b3087be028d00fb29a9f951bf
parentf80ce055890985eb94a8de961475339df90a20ca (diff)
downloadlibexpat-5d6dba5218bc4e04ff121cf5d54564d3fbd84870.tar.gz
Fix for bug #3500861 - setContext() called before hash salt was set.
-rw-r--r--lib/xmlparse.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/lib/xmlparse.c b/lib/xmlparse.c
index 3a4e86d..b7389eb 100644
--- a/lib/xmlparse.c
+++ b/lib/xmlparse.c
@@ -432,6 +432,9 @@ static ELEMENT_TYPE *
getElementType(XML_Parser parser, const ENCODING *enc,
const char *ptr, const char *end);
+static unsigned long generate_hash_secret_salt(void);
+static XML_Bool parsingSetup(XML_Parser parser);
+
static XML_Parser
parserCreate(const XML_Char *encodingName,
const XML_Memory_Handling_Suite *memsuite,
@@ -695,22 +698,27 @@ generate_hash_secret_salt(void)
return rand();
}
+static XML_Bool
+parsingSetup(XML_Parser parser)
+{
+ /* hash functions must be initialized before setContext() is called */
+ if (hash_secret_salt == 0)
+ hash_secret_salt = generate_hash_secret_salt();
+ if (parser != NULL && ns) {
+ /* implicit context only set for root parser, since child
+ parsers (i.e. external entity parsers) will inherit it
+ */
+ return setContext(parser, implicitContext);
+ }
+ return XML_TRUE;
+}
+
XML_Parser XMLCALL
XML_ParserCreate_MM(const XML_Char *encodingName,
const XML_Memory_Handling_Suite *memsuite,
const XML_Char *nameSep)
{
- XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL);
- if (parser != NULL && ns) {
- /* implicit context only set for root parser, since child
- parsers (i.e. external entity parsers) will inherit it
- */
- if (!setContext(parser, implicitContext)) {
- XML_ParserFree(parser);
- return NULL;
- }
- }
- return parser;
+ return parserCreate(encodingName, memsuite, nameSep, NULL);
}
static XML_Parser
@@ -946,7 +954,7 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName)
poolClear(&temp2Pool);
parserInit(parser, encodingName);
dtdReset(_dtd, &parser->m_mem);
- return setContext(parser, implicitContext);
+ return XML_TRUE;
}
enum XML_Status XMLCALL
@@ -1499,8 +1507,10 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
errorCode = XML_ERROR_FINISHED;
return XML_STATUS_ERROR;
case XML_INITIALIZED:
- if (hash_secret_salt == 0)
- hash_secret_salt = generate_hash_secret_salt();
+ if (!parsingSetup(parser)) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ return XML_STATUS_ERROR;
+ }
default:
ps_parsing = XML_PARSING;
}
@@ -1623,8 +1633,10 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
errorCode = XML_ERROR_FINISHED;
return XML_STATUS_ERROR;
case XML_INITIALIZED:
- if (hash_secret_salt == 0)
- hash_secret_salt = generate_hash_secret_salt();
+ if (!parsingSetup(parser)) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ return XML_STATUS_ERROR;
+ }
default:
ps_parsing = XML_PARSING;
}