Index: third_party/expat/files/lib/xmlparse.c |
diff --git a/third_party/expat/files/lib/xmlparse.c b/third_party/expat/files/lib/xmlparse.c |
index 94e31de9da3f3ce3d52755923e98602844b1330d..f35aa36ba8a7fce3bae90f31b20354435b15d2f2 100644 |
--- a/third_party/expat/files/lib/xmlparse.c |
+++ b/third_party/expat/files/lib/xmlparse.c |
@@ -5,6 +5,8 @@ |
#include <stddef.h> |
#include <string.h> /* memset(), memcpy() */ |
#include <assert.h> |
+#include <limits.h> /* UINT_MAX */ |
+#include <time.h> /* time() */ |
#define XML_BUILDING_EXPAT 1 |
@@ -12,7 +14,7 @@ |
#include "winconfig.h" |
#elif defined(MACOS_CLASSIC) |
#include "macconfig.h" |
-#elif defined(__amigaos4__) |
+#elif defined(__amigaos__) |
#include "amigaconfig.h" |
#elif defined(__WATCOMC__) |
#include "watcomconfig.h" |
@@ -327,15 +329,15 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity, |
static enum XML_Error |
initializeEncoding(XML_Parser parser); |
static enum XML_Error |
-doProlog(XML_Parser parser, const ENCODING *enc, const char *s, |
- const char *end, int tok, const char *next, const char **nextPtr, |
+doProlog(XML_Parser parser, const ENCODING *enc, const char *s, |
+ const char *end, int tok, const char *next, const char **nextPtr, |
XML_Bool haveMore); |
static enum XML_Error |
-processInternalEntity(XML_Parser parser, ENTITY *entity, |
+processInternalEntity(XML_Parser parser, ENTITY *entity, |
XML_Bool betweenDecl); |
static enum XML_Error |
doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, |
- const char *start, const char *end, const char **endPtr, |
+ const char *start, const char *end, const char **endPtr, |
XML_Bool haveMore); |
static enum XML_Error |
doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, |
@@ -353,7 +355,7 @@ static enum XML_Error |
addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, |
const XML_Char *uri, BINDING **bindingsPtr); |
static int |
-defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, |
+defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, |
XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); |
static enum XML_Error |
storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, |
@@ -391,12 +393,13 @@ static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); |
static void |
dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); |
static int |
-dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); |
+dtdCopy(XML_Parser oldParser, |
+ DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); |
static int |
-copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); |
- |
+copyEntityTable(XML_Parser oldParser, |
+ HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); |
static NAMED * |
-lookup(HASH_TABLE *table, KEY name, size_t createSize); |
+lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize); |
static void FASTCALL |
hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); |
static void FASTCALL hashTableClear(HASH_TABLE *); |
@@ -429,11 +432,15 @@ 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 startParsing(XML_Parser parser); |
+ |
static XML_Parser |
parserCreate(const XML_Char *encodingName, |
const XML_Memory_Handling_Suite *memsuite, |
const XML_Char *nameSep, |
DTD *dtd); |
+ |
static void |
parserInit(XML_Parser parser, const XML_Char *encodingName); |
@@ -533,6 +540,9 @@ struct XML_ParserStruct { |
NS_ATT *m_nsAtts; |
unsigned long m_nsAttsVersion; |
unsigned char m_nsAttsPower; |
+#ifdef XML_ATTR_INFO |
+ XML_AttrInfo *m_attInfo; |
+#endif |
POSITION m_position; |
STRING_POOL m_tempPool; |
STRING_POOL m_temp2Pool; |
@@ -546,6 +556,7 @@ struct XML_ParserStruct { |
XML_Bool m_useForeignDTD; |
enum XML_ParamEntityParsing m_paramEntityParsing; |
#endif |
+ unsigned long m_hash_secret_salt; |
}; |
#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) |
@@ -640,6 +651,7 @@ struct XML_ParserStruct { |
#define nsAtts (parser->m_nsAtts) |
#define nsAttsVersion (parser->m_nsAttsVersion) |
#define nsAttsPower (parser->m_nsAttsPower) |
+#define attInfo (parser->m_attInfo) |
#define tempPool (parser->m_tempPool) |
#define temp2Pool (parser->m_temp2Pool) |
#define groupConnector (parser->m_groupConnector) |
@@ -653,6 +665,7 @@ struct XML_ParserStruct { |
#define useForeignDTD (parser->m_useForeignDTD) |
#define paramEntityParsing (parser->m_paramEntityParsing) |
#endif /* XML_DTD */ |
+#define hash_secret_salt (parser->m_hash_secret_salt) |
XML_Parser XMLCALL |
XML_ParserCreate(const XML_Char *encodingName) |
@@ -670,29 +683,42 @@ XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) |
static const XML_Char implicitContext[] = { |
ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p, |
- ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, |
+ ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, |
ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, |
ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, |
ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, |
ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0' |
}; |
+static unsigned long |
+generate_hash_secret_salt(void) |
+{ |
+ unsigned int seed = time(NULL) % UINT_MAX; |
+ srand(seed); |
+ return rand(); |
+} |
+ |
+static XML_Bool /* only valid for root parser */ |
+startParsing(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 (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 |
@@ -737,9 +763,20 @@ parserCreate(const XML_Char *encodingName, |
FREE(parser); |
return NULL; |
} |
+#ifdef XML_ATTR_INFO |
+ attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo)); |
+ if (attInfo == NULL) { |
+ FREE(atts); |
+ FREE(parser); |
+ return NULL; |
+ } |
+#endif |
dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); |
if (dataBuf == NULL) { |
FREE(atts); |
+#ifdef XML_ATTR_INFO |
+ FREE(attInfo); |
+#endif |
FREE(parser); |
return NULL; |
} |
@@ -752,6 +789,9 @@ parserCreate(const XML_Char *encodingName, |
if (_dtd == NULL) { |
FREE(dataBuf); |
FREE(atts); |
+#ifdef XML_ATTR_INFO |
+ FREE(attInfo); |
+#endif |
FREE(parser); |
return NULL; |
} |
@@ -866,6 +906,7 @@ parserInit(XML_Parser parser, const XML_Char *encodingName) |
useForeignDTD = XML_FALSE; |
paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; |
#endif |
+ hash_secret_salt = 0; |
} |
/* moves list of bindings to freeBindingList */ |
@@ -913,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 |
@@ -982,6 +1023,12 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, |
int oldInEntityValue = prologState.inEntityValue; |
#endif |
XML_Bool oldns_triplets = ns_triplets; |
+ /* Note that the new parser shares the same hash secret as the old |
+ parser, so that dtdCopy and copyEntityTable can lookup values |
+ from hash tables associated with either parser without us having |
+ to worry which hash secrets each table has. |
+ */ |
+ unsigned long oldhash_secret_salt = hash_secret_salt; |
#ifdef XML_DTD |
if (!context) |
@@ -1035,13 +1082,14 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, |
externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; |
defaultExpandInternalEntities = oldDefaultExpandInternalEntities; |
ns_triplets = oldns_triplets; |
+ hash_secret_salt = oldhash_secret_salt; |
parentParser = oldParser; |
#ifdef XML_DTD |
paramEntityParsing = oldParamEntityParsing; |
prologState.inEntityValue = oldInEntityValue; |
if (context) { |
#endif /* XML_DTD */ |
- if (!dtdCopy(_dtd, oldDtd, &parser->m_mem) |
+ if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem) |
|| !setContext(parser, context)) { |
XML_ParserFree(parser); |
return NULL; |
@@ -1130,6 +1178,9 @@ XML_ParserFree(XML_Parser parser) |
#endif /* XML_DTD */ |
dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); |
FREE((void *)atts); |
+#ifdef XML_ATTR_INFO |
+ FREE((void *)attInfo); |
+#endif |
FREE(groupConnector); |
FREE(buffer); |
FREE(dataBuf); |
@@ -1210,6 +1261,14 @@ XML_GetIdAttributeIndex(XML_Parser parser) |
return idAttIndex; |
} |
+#ifdef XML_ATTR_INFO |
+const XML_AttrInfo * XMLCALL |
+XML_GetAttributeInfo(XML_Parser parser) |
+{ |
+ return attInfo; |
+} |
+#endif |
+ |
void XMLCALL |
XML_SetElementHandler(XML_Parser parser, |
XML_StartElementHandler start, |
@@ -1426,6 +1485,17 @@ XML_SetParamEntityParsing(XML_Parser parser, |
#endif |
} |
+int XMLCALL |
+XML_SetHashSalt(XML_Parser parser, |
+ unsigned long hash_salt) |
+{ |
+ /* block after XML_Parse()/XML_ParseBuffer() has been called */ |
+ if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) |
+ return 0; |
+ hash_secret_salt = hash_salt; |
+ return 1; |
+} |
+ |
enum XML_Status XMLCALL |
XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) |
{ |
@@ -1436,6 +1506,11 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) |
case XML_FINISHED: |
errorCode = XML_ERROR_FINISHED; |
return XML_STATUS_ERROR; |
+ case XML_INITIALIZED: |
+ if (parentParser == NULL && !startParsing(parser)) { |
+ errorCode = XML_ERROR_NO_MEMORY; |
+ return XML_STATUS_ERROR; |
+ } |
default: |
ps_parsing = XML_PARSING; |
} |
@@ -1459,7 +1534,7 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) |
XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); |
positionPtr = bufferPtr; |
return XML_STATUS_SUSPENDED; |
- case XML_INITIALIZED: |
+ case XML_INITIALIZED: |
case XML_PARSING: |
ps_parsing = XML_FINISHED; |
/* fall through */ |
@@ -1494,11 +1569,13 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) |
break; |
case XML_INITIALIZED: |
case XML_PARSING: |
- result = XML_STATUS_OK; |
if (isFinal) { |
ps_parsing = XML_FINISHED; |
- return result; |
+ return XML_STATUS_OK; |
} |
+ /* fall through */ |
+ default: |
+ result = XML_STATUS_OK; |
} |
} |
@@ -1513,15 +1590,11 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) |
: (char *)REALLOC(buffer, len * 2)); |
if (temp == NULL) { |
errorCode = XML_ERROR_NO_MEMORY; |
- return XML_STATUS_ERROR; |
- } |
- buffer = temp; |
- if (!buffer) { |
- errorCode = XML_ERROR_NO_MEMORY; |
eventPtr = eventEndPtr = NULL; |
processor = errorProcessor; |
return XML_STATUS_ERROR; |
} |
+ buffer = temp; |
bufferLim = buffer + len * 2; |
} |
memcpy(buffer, end, nLeftOver); |
@@ -1559,6 +1632,11 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) |
case XML_FINISHED: |
errorCode = XML_ERROR_FINISHED; |
return XML_STATUS_ERROR; |
+ case XML_INITIALIZED: |
+ if (parentParser == NULL && !startParsing(parser)) { |
+ errorCode = XML_ERROR_NO_MEMORY; |
+ return XML_STATUS_ERROR; |
+ } |
default: |
ps_parsing = XML_PARSING; |
} |
@@ -1582,7 +1660,7 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) |
case XML_SUSPENDED: |
result = XML_STATUS_SUSPENDED; |
break; |
- case XML_INITIALIZED: |
+ case XML_INITIALIZED: |
case XML_PARSING: |
if (isFinal) { |
ps_parsing = XML_FINISHED; |
@@ -1672,6 +1750,8 @@ XML_GetBuffer(XML_Parser parser, int len) |
bufferPtr = buffer = newBuf; |
#endif /* not defined XML_CONTEXT_BYTES */ |
} |
+ eventPtr = eventEndPtr = NULL; |
+ positionPtr = NULL; |
} |
return bufferEnd; |
} |
@@ -1729,7 +1809,7 @@ XML_ResumeParser(XML_Parser parser) |
case XML_SUSPENDED: |
result = XML_STATUS_SUSPENDED; |
break; |
- case XML_INITIALIZED: |
+ case XML_INITIALIZED: |
case XML_PARSING: |
if (ps_finalBuffer) { |
ps_parsing = XML_FINISHED; |
@@ -1956,7 +2036,10 @@ XML_GetFeatureList(void) |
#endif |
#ifdef XML_LARGE_SIZE |
{XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, |
-#endif |
+#endif |
+#ifdef XML_ATTR_INFO |
+ {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, |
+#endif |
{XML_FEATURE_END, NULL, 0} |
}; |
@@ -2019,7 +2102,7 @@ contentProcessor(XML_Parser parser, |
const char *end, |
const char **endPtr) |
{ |
- enum XML_Error result = doContent(parser, 0, encoding, start, end, |
+ enum XML_Error result = doContent(parser, 0, encoding, start, end, |
endPtr, (XML_Bool)!ps_finalBuffer); |
if (result == XML_ERROR_NONE) { |
if (!storeRawNames(parser)) |
@@ -2101,7 +2184,7 @@ externalEntityInitProcessor3(XML_Parser parser, |
if (result != XML_ERROR_NONE) |
return result; |
switch (ps_parsing) { |
- case XML_SUSPENDED: |
+ case XML_SUSPENDED: |
*endPtr = next; |
return XML_ERROR_NONE; |
case XML_FINISHED: |
@@ -2135,7 +2218,7 @@ externalEntityContentProcessor(XML_Parser parser, |
const char *end, |
const char **endPtr) |
{ |
- enum XML_Error result = doContent(parser, 1, encoding, start, end, |
+ enum XML_Error result = doContent(parser, 1, encoding, start, end, |
endPtr, (XML_Bool)!ps_finalBuffer); |
if (result == XML_ERROR_NONE) { |
if (!storeRawNames(parser)) |
@@ -2154,7 +2237,7 @@ doContent(XML_Parser parser, |
XML_Bool haveMore) |
{ |
/* save one level of indirection */ |
- DTD * const dtd = _dtd; |
+ DTD * const dtd = _dtd; |
const char **eventPP; |
const char **eventEndPP; |
@@ -2185,8 +2268,8 @@ doContent(XML_Parser parser, |
} |
else if (defaultHandler) |
reportDefault(parser, enc, s, end); |
- /* We are at the end of the final buffer, should we check for |
- XML_SUSPENDED, XML_FINISHED? |
+ /* We are at the end of the final buffer, should we check for |
+ XML_SUSPENDED, XML_FINISHED? |
*/ |
if (startTagLevel == 0) |
return XML_ERROR_NO_ELEMENTS; |
@@ -2240,7 +2323,7 @@ doContent(XML_Parser parser, |
next - enc->minBytesPerChar); |
if (!name) |
return XML_ERROR_NO_MEMORY; |
- entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); |
+ entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); |
poolDiscard(&dtd->pool); |
/* First, determine if a check for an existing declaration is needed; |
if yes, check that the entity exists, and that it is internal, |
@@ -2537,8 +2620,8 @@ doContent(XML_Parser parser, |
} |
else if (defaultHandler) |
reportDefault(parser, enc, s, end); |
- /* We are at the end of the final buffer, should we check for |
- XML_SUSPENDED, XML_FINISHED? |
+ /* We are at the end of the final buffer, should we check for |
+ XML_SUSPENDED, XML_FINISHED? |
*/ |
if (startTagLevel == 0) { |
*eventPP = end; |
@@ -2550,7 +2633,7 @@ doContent(XML_Parser parser, |
} |
*nextPtr = end; |
return XML_ERROR_NONE; |
- case XML_TOK_DATA_CHARS: |
+ case XML_TOK_DATA_CHARS: |
{ |
XML_CharacterDataHandler charDataHandler = characterDataHandler; |
if (charDataHandler) { |
@@ -2590,7 +2673,7 @@ doContent(XML_Parser parser, |
} |
*eventPP = s = next; |
switch (ps_parsing) { |
- case XML_SUSPENDED: |
+ case XML_SUSPENDED: |
*nextPtr = next; |
return XML_ERROR_NONE; |
case XML_FINISHED: |
@@ -2630,12 +2713,12 @@ storeAtts(XML_Parser parser, const ENCODING *enc, |
const XML_Char *localPart; |
/* lookup the element type name */ |
- elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0); |
+ elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0); |
if (!elementType) { |
const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); |
if (!name) |
return XML_ERROR_NO_MEMORY; |
- elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name, |
+ elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, |
sizeof(ELEMENT_TYPE)); |
if (!elementType) |
return XML_ERROR_NO_MEMORY; |
@@ -2649,23 +2732,44 @@ storeAtts(XML_Parser parser, const ENCODING *enc, |
if (n + nDefaultAtts > attsSize) { |
int oldAttsSize = attsSize; |
ATTRIBUTE *temp; |
+#ifdef XML_ATTR_INFO |
+ XML_AttrInfo *temp2; |
+#endif |
attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; |
temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); |
if (temp == NULL) |
return XML_ERROR_NO_MEMORY; |
atts = temp; |
+#ifdef XML_ATTR_INFO |
+ temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo)); |
+ if (temp2 == NULL) |
+ return XML_ERROR_NO_MEMORY; |
+ attInfo = temp2; |
+#endif |
if (n > oldAttsSize) |
XmlGetAttributes(enc, attStr, n, atts); |
} |
appAtts = (const XML_Char **)atts; |
for (i = 0; i < n; i++) { |
+ ATTRIBUTE *currAtt = &atts[i]; |
+#ifdef XML_ATTR_INFO |
+ XML_AttrInfo *currAttInfo = &attInfo[i]; |
+#endif |
/* add the name and value to the attribute list */ |
- ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, |
- atts[i].name |
- + XmlNameLength(enc, atts[i].name)); |
+ ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name, |
+ currAtt->name |
+ + XmlNameLength(enc, currAtt->name)); |
if (!attId) |
return XML_ERROR_NO_MEMORY; |
+#ifdef XML_ATTR_INFO |
+ currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name); |
+ currAttInfo->nameEnd = currAttInfo->nameStart + |
+ XmlNameLength(enc, currAtt->name); |
+ currAttInfo->valueStart = parseEndByteIndex - |
+ (parseEndPtr - currAtt->valuePtr); |
+ currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd); |
+#endif |
/* Detect duplicate attributes by their QNames. This does not work when |
namespace processing is turned on and different prefixes for the same |
namespace are used. For this case we have a check further down. |
@@ -2804,9 +2908,9 @@ storeAtts(XML_Parser parser, const ENCODING *enc, |
if (s[-1] == 2) { /* prefixed */ |
ATTRIBUTE_ID *id; |
const BINDING *b; |
- unsigned long uriHash = 0; |
+ unsigned long uriHash = hash_secret_salt; |
((XML_Char *)s)[-1] = 0; /* clear flag */ |
- id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, s, 0); |
+ id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0); |
b = id->prefix->binding; |
if (!b) |
return XML_ERROR_UNBOUND_PREFIX; |
@@ -2828,7 +2932,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc, |
} while (*s++); |
{ /* Check hash table for duplicate of expanded name (uriName). |
- Derived from code in lookup(HASH_TABLE *table, ...). |
+ Derived from code in lookup(parser, HASH_TABLE *table, ...). |
*/ |
unsigned char step = 0; |
unsigned long mask = nsAttsSize - 1; |
@@ -2949,27 +3053,27 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, |
static const XML_Char xmlNamespace[] = { |
ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, |
ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, |
- ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, |
+ ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, |
ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH, |
ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, |
ASCII_e, '\0' |
}; |
- static const int xmlLen = |
+ static const int xmlLen = |
(int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1; |
static const XML_Char xmlnsNamespace[] = { |
ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, |
ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, |
- ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, |
- ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, |
+ ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, |
+ ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, |
ASCII_SLASH, '\0' |
}; |
- static const int xmlnsLen = |
+ static const int xmlnsLen = |
(int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1; |
XML_Bool mustBeXML = XML_FALSE; |
XML_Bool isXML = XML_TRUE; |
XML_Bool isXMLNS = XML_TRUE; |
- |
+ |
BINDING *b; |
int len; |
@@ -2996,7 +3100,7 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, |
if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) |
isXML = XML_FALSE; |
- if (!mustBeXML && isXMLNS |
+ if (!mustBeXML && isXMLNS |
&& (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) |
isXMLNS = XML_FALSE; |
} |
@@ -3207,7 +3311,7 @@ ignoreSectionProcessor(XML_Parser parser, |
const char *end, |
const char **endPtr) |
{ |
- enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, |
+ enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, |
endPtr, (XML_Bool)!ps_finalBuffer); |
if (result != XML_ERROR_NONE) |
return result; |
@@ -3489,7 +3593,7 @@ entityValueInitProcessor(XML_Parser parser, |
const char *next = start; |
eventPtr = start; |
- for (;;) { |
+ for (;;) { |
tok = XmlPrologTok(encoding, start, end, &next); |
eventEndPtr = next; |
if (tok <= 0) { |
@@ -3517,7 +3621,7 @@ entityValueInitProcessor(XML_Parser parser, |
if (result != XML_ERROR_NONE) |
return result; |
switch (ps_parsing) { |
- case XML_SUSPENDED: |
+ case XML_SUSPENDED: |
*nextPtr = next; |
return XML_ERROR_NONE; |
case XML_FINISHED: |
@@ -3582,7 +3686,7 @@ externalParEntProcessor(XML_Parser parser, |
} |
processor = prologProcessor; |
- return doProlog(parser, encoding, s, end, tok, next, |
+ return doProlog(parser, encoding, s, end, tok, next, |
nextPtr, (XML_Bool)!ps_finalBuffer); |
} |
@@ -3632,7 +3736,7 @@ prologProcessor(XML_Parser parser, |
{ |
const char *next = s; |
int tok = XmlPrologTok(encoding, s, end, &next); |
- return doProlog(parser, encoding, s, end, tok, next, |
+ return doProlog(parser, encoding, s, end, tok, next, |
nextPtr, (XML_Bool)!ps_finalBuffer); |
} |
@@ -3649,7 +3753,7 @@ doProlog(XML_Parser parser, |
#ifdef XML_DTD |
static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' }; |
#endif /* XML_DTD */ |
- static const XML_Char atypeCDATA[] = |
+ static const XML_Char atypeCDATA[] = |
{ ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; |
static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' }; |
static const XML_Char atypeIDREF[] = |
@@ -3670,7 +3774,7 @@ doProlog(XML_Parser parser, |
static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' }; |
/* save one level of indirection */ |
- DTD * const dtd = _dtd; |
+ DTD * const dtd = _dtd; |
const char **eventPP; |
const char **eventEndPP; |
@@ -3703,6 +3807,9 @@ doProlog(XML_Parser parser, |
return XML_ERROR_UNCLOSED_TOKEN; |
case XML_TOK_PARTIAL_CHAR: |
return XML_ERROR_PARTIAL_CHAR; |
+ case -XML_TOK_PROLOG_S: |
+ tok = -tok; |
+ break; |
case XML_TOK_NONE: |
#ifdef XML_DTD |
/* for internal PE NOT referenced between declarations */ |
@@ -3774,7 +3881,8 @@ doProlog(XML_Parser parser, |
case XML_ROLE_DOCTYPE_PUBLIC_ID: |
#ifdef XML_DTD |
useForeignDTD = XML_FALSE; |
- declEntity = (ENTITY *)lookup(&dtd->paramEntities, |
+ declEntity = (ENTITY *)lookup(parser, |
+ &dtd->paramEntities, |
externalSubsetName, |
sizeof(ENTITY)); |
if (!declEntity) |
@@ -3782,15 +3890,17 @@ doProlog(XML_Parser parser, |
#endif /* XML_DTD */ |
dtd->hasParamEntityRefs = XML_TRUE; |
if (startDoctypeDeclHandler) { |
+ XML_Char *pubId; |
if (!XmlIsPublicId(enc, s, next, eventPP)) |
return XML_ERROR_PUBLICID; |
- doctypePubid = poolStoreString(&tempPool, enc, |
- s + enc->minBytesPerChar, |
- next - enc->minBytesPerChar); |
- if (!doctypePubid) |
+ pubId = poolStoreString(&tempPool, enc, |
+ s + enc->minBytesPerChar, |
+ next - enc->minBytesPerChar); |
+ if (!pubId) |
return XML_ERROR_NO_MEMORY; |
- normalizePublicId((XML_Char *)doctypePubid); |
+ normalizePublicId(pubId); |
poolFinish(&tempPool); |
+ doctypePubid = pubId; |
handleDefault = XML_FALSE; |
goto alreadyChecked; |
} |
@@ -3829,7 +3939,8 @@ doProlog(XML_Parser parser, |
XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; |
dtd->hasParamEntityRefs = XML_TRUE; |
if (paramEntityParsing && externalEntityRefHandler) { |
- ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, |
+ ENTITY *entity = (ENTITY *)lookup(parser, |
+ &dtd->paramEntities, |
externalSubsetName, |
sizeof(ENTITY)); |
if (!entity) |
@@ -3844,8 +3955,8 @@ doProlog(XML_Parser parser, |
entity->publicId)) |
return XML_ERROR_EXTERNAL_ENTITY_HANDLING; |
if (dtd->paramEntityRead) { |
- if (!dtd->standalone && |
- notStandaloneHandler && |
+ if (!dtd->standalone && |
+ notStandaloneHandler && |
!notStandaloneHandler(handlerArg)) |
return XML_ERROR_NOT_STANDALONE; |
} |
@@ -3873,7 +3984,7 @@ doProlog(XML_Parser parser, |
XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; |
dtd->hasParamEntityRefs = XML_TRUE; |
if (paramEntityParsing && externalEntityRefHandler) { |
- ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, |
+ ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, |
externalSubsetName, |
sizeof(ENTITY)); |
if (!entity) |
@@ -4087,7 +4198,8 @@ doProlog(XML_Parser parser, |
break; |
#else /* XML_DTD */ |
if (!declEntity) { |
- declEntity = (ENTITY *)lookup(&dtd->paramEntities, |
+ declEntity = (ENTITY *)lookup(parser, |
+ &dtd->paramEntities, |
externalSubsetName, |
sizeof(ENTITY)); |
if (!declEntity) |
@@ -4162,7 +4274,7 @@ doProlog(XML_Parser parser, |
const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); |
if (!name) |
return XML_ERROR_NO_MEMORY; |
- declEntity = (ENTITY *)lookup(&dtd->generalEntities, name, |
+ declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, |
sizeof(ENTITY)); |
if (!declEntity) |
return XML_ERROR_NO_MEMORY; |
@@ -4194,7 +4306,7 @@ doProlog(XML_Parser parser, |
const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); |
if (!name) |
return XML_ERROR_NO_MEMORY; |
- declEntity = (ENTITY *)lookup(&dtd->paramEntities, |
+ declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities, |
name, sizeof(ENTITY)); |
if (!declEntity) |
return XML_ERROR_NO_MEMORY; |
@@ -4283,7 +4395,7 @@ doProlog(XML_Parser parser, |
switch (tok) { |
case XML_TOK_PARAM_ENTITY_REF: |
/* PE references in internal subset are |
- not allowed within declarations. */ |
+ not allowed within declarations. */ |
return XML_ERROR_PARAM_ENTITY_REF; |
case XML_TOK_XML_DECL: |
return XML_ERROR_MISPLACED_XML_PI; |
@@ -4376,7 +4488,7 @@ doProlog(XML_Parser parser, |
next - enc->minBytesPerChar); |
if (!name) |
return XML_ERROR_NO_MEMORY; |
- entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); |
+ entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); |
poolDiscard(&dtd->pool); |
/* first, determine if a check for an existing declaration is needed; |
if yes, check that the entity exists, and that it is internal, |
@@ -4404,7 +4516,7 @@ doProlog(XML_Parser parser, |
return XML_ERROR_RECURSIVE_ENTITY_REF; |
if (entity->textPtr) { |
enum XML_Error result; |
- XML_Bool betweenDecl = |
+ XML_Bool betweenDecl = |
(role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); |
result = processInternalEntity(parser, entity, betweenDecl); |
if (result != XML_ERROR_NONE) |
@@ -4599,7 +4711,7 @@ doProlog(XML_Parser parser, |
reportDefault(parser, enc, s, next); |
switch (ps_parsing) { |
- case XML_SUSPENDED: |
+ case XML_SUSPENDED: |
*nextPtr = next; |
return XML_ERROR_NONE; |
case XML_FINISHED: |
@@ -4669,7 +4781,7 @@ epilogProcessor(XML_Parser parser, |
} |
eventPtr = s = next; |
switch (ps_parsing) { |
- case XML_SUSPENDED: |
+ case XML_SUSPENDED: |
*nextPtr = next; |
return XML_ERROR_NONE; |
case XML_FINISHED: |
@@ -4712,12 +4824,12 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, |
#ifdef XML_DTD |
if (entity->is_param) { |
int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); |
- result = doProlog(parser, internalEncoding, textStart, textEnd, tok, |
+ result = doProlog(parser, internalEncoding, textStart, textEnd, tok, |
next, &next, XML_FALSE); |
} |
- else |
+ else |
#endif /* XML_DTD */ |
- result = doContent(parser, tagLevel, internalEncoding, textStart, |
+ result = doContent(parser, tagLevel, internalEncoding, textStart, |
textEnd, &next, XML_FALSE); |
if (result == XML_ERROR_NONE) { |
@@ -4757,13 +4869,13 @@ internalEntityProcessor(XML_Parser parser, |
#ifdef XML_DTD |
if (entity->is_param) { |
int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); |
- result = doProlog(parser, internalEncoding, textStart, textEnd, tok, |
+ result = doProlog(parser, internalEncoding, textStart, textEnd, tok, |
next, &next, XML_FALSE); |
} |
else |
#endif /* XML_DTD */ |
- result = doContent(parser, openEntity->startTagLevel, internalEncoding, |
- textStart, textEnd, &next, XML_FALSE); |
+ result = doContent(parser, openEntity->startTagLevel, internalEncoding, |
+ textStart, textEnd, &next, XML_FALSE); |
if (result != XML_ERROR_NONE) |
return result; |
@@ -4784,7 +4896,7 @@ internalEntityProcessor(XML_Parser parser, |
int tok; |
processor = prologProcessor; |
tok = XmlPrologTok(encoding, s, end, &next); |
- return doProlog(parser, encoding, s, end, tok, next, nextPtr, |
+ return doProlog(parser, encoding, s, end, tok, next, nextPtr, |
(XML_Bool)!ps_finalBuffer); |
} |
else |
@@ -4793,8 +4905,8 @@ internalEntityProcessor(XML_Parser parser, |
processor = contentProcessor; |
/* see externalEntityContentProcessor vs contentProcessor */ |
return doContent(parser, parentParser ? 1 : 0, encoding, s, end, |
- nextPtr, (XML_Bool)!ps_finalBuffer); |
- } |
+ nextPtr, (XML_Bool)!ps_finalBuffer); |
+ } |
} |
static enum XML_Error PTRCALL |
@@ -4900,7 +5012,7 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, |
next - enc->minBytesPerChar); |
if (!name) |
return XML_ERROR_NO_MEMORY; |
- entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); |
+ entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); |
poolDiscard(&temp2Pool); |
/* First, determine if a check for an existing declaration is needed; |
if yes, check that the entity exists, and that it is internal. |
@@ -4947,7 +5059,7 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, |
if (!entity->textPtr) { |
if (enc == encoding) |
eventPtr = ptr; |
- return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; |
+ return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; |
} |
else { |
enum XML_Error result; |
@@ -5009,7 +5121,7 @@ storeEntityValue(XML_Parser parser, |
result = XML_ERROR_NO_MEMORY; |
goto endEntityValue; |
} |
- entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); |
+ entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); |
poolDiscard(&tempPool); |
if (!entity) { |
/* not a well-formedness error - see XML 1.0: WFC Entity Declared */ |
@@ -5299,7 +5411,7 @@ setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) |
} |
if (!poolAppendChar(&dtd->pool, XML_T('\0'))) |
return 0; |
- prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), |
+ prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), |
sizeof(PREFIX)); |
if (!prefix) |
return 0; |
@@ -5328,7 +5440,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc, |
return NULL; |
/* skip quotation mark - its storage will be re-used (like in name[-1]) */ |
++name; |
- id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); |
+ id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); |
if (!id) |
return NULL; |
if (id->name != name) |
@@ -5346,7 +5458,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc, |
if (name[5] == XML_T('\0')) |
id->prefix = &dtd->defaultPrefix; |
else |
- id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX)); |
+ id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX)); |
id->xmlns = XML_TRUE; |
} |
else { |
@@ -5361,7 +5473,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc, |
} |
if (!poolAppendChar(&dtd->pool, XML_T('\0'))) |
return NULL; |
- id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), |
+ id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), |
sizeof(PREFIX)); |
if (id->prefix->name == poolStart(&dtd->pool)) |
poolFinish(&dtd->pool); |
@@ -5457,7 +5569,7 @@ setContext(XML_Parser parser, const XML_Char *context) |
ENTITY *e; |
if (!poolAppendChar(&tempPool, XML_T('\0'))) |
return XML_FALSE; |
- e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0); |
+ e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0); |
if (e) |
e->open = XML_TRUE; |
if (*s != XML_T('\0')) |
@@ -5472,7 +5584,7 @@ setContext(XML_Parser parser, const XML_Char *context) |
else { |
if (!poolAppendChar(&tempPool, XML_T('\0'))) |
return XML_FALSE; |
- prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool), |
+ prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool), |
sizeof(PREFIX)); |
if (!prefix) |
return XML_FALSE; |
@@ -5636,7 +5748,7 @@ dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) |
The new DTD has already been initialized. |
*/ |
static int |
-dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) |
+dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) |
{ |
HASH_TABLE_ITER iter; |
@@ -5651,7 +5763,7 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) |
name = poolCopyString(&(newDtd->pool), oldP->name); |
if (!name) |
return 0; |
- if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) |
+ if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) |
return 0; |
} |
@@ -5673,7 +5785,7 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) |
if (!name) |
return 0; |
++name; |
- newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, |
+ newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name, |
sizeof(ATTRIBUTE_ID)); |
if (!newA) |
return 0; |
@@ -5683,7 +5795,7 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) |
if (oldA->prefix == &oldDtd->defaultPrefix) |
newA->prefix = &newDtd->defaultPrefix; |
else |
- newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), |
+ newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), |
oldA->prefix->name, 0); |
} |
} |
@@ -5702,7 +5814,7 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) |
name = poolCopyString(&(newDtd->pool), oldE->name); |
if (!name) |
return 0; |
- newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, |
+ newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name, |
sizeof(ELEMENT_TYPE)); |
if (!newE) |
return 0; |
@@ -5716,14 +5828,14 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) |
} |
if (oldE->idAtt) |
newE->idAtt = (ATTRIBUTE_ID *) |
- lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); |
+ lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0); |
newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; |
if (oldE->prefix) |
- newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), |
+ newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), |
oldE->prefix->name, 0); |
for (i = 0; i < newE->nDefaultAtts; i++) { |
newE->defaultAtts[i].id = (ATTRIBUTE_ID *) |
- lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); |
+ lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); |
newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; |
if (oldE->defaultAtts[i].value) { |
newE->defaultAtts[i].value |
@@ -5737,13 +5849,15 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) |
} |
/* Copy the entity tables. */ |
- if (!copyEntityTable(&(newDtd->generalEntities), |
+ if (!copyEntityTable(oldParser, |
+ &(newDtd->generalEntities), |
&(newDtd->pool), |
&(oldDtd->generalEntities))) |
return 0; |
#ifdef XML_DTD |
- if (!copyEntityTable(&(newDtd->paramEntities), |
+ if (!copyEntityTable(oldParser, |
+ &(newDtd->paramEntities), |
&(newDtd->pool), |
&(oldDtd->paramEntities))) |
return 0; |
@@ -5766,7 +5880,8 @@ dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) |
} /* End dtdCopy */ |
static int |
-copyEntityTable(HASH_TABLE *newTable, |
+copyEntityTable(XML_Parser oldParser, |
+ HASH_TABLE *newTable, |
STRING_POOL *newPool, |
const HASH_TABLE *oldTable) |
{ |
@@ -5785,7 +5900,7 @@ copyEntityTable(HASH_TABLE *newTable, |
name = poolCopyString(newPool, oldE->name); |
if (!name) |
return 0; |
- newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY)); |
+ newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY)); |
if (!newE) |
return 0; |
if (oldE->systemId) { |
@@ -5843,16 +5958,16 @@ keyeq(KEY s1, KEY s2) |
} |
static unsigned long FASTCALL |
-hash(KEY s) |
+hash(XML_Parser parser, KEY s) |
{ |
- unsigned long h = 0; |
+ unsigned long h = hash_secret_salt; |
while (*s) |
h = CHAR_HASH(h, *s++); |
return h; |
} |
static NAMED * |
-lookup(HASH_TABLE *table, KEY name, size_t createSize) |
+lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) |
{ |
size_t i; |
if (table->size == 0) { |
@@ -5869,10 +5984,10 @@ lookup(HASH_TABLE *table, KEY name, size_t createSize) |
return NULL; |
} |
memset(table->v, 0, tsize); |
- i = hash(name) & ((unsigned long)table->size - 1); |
+ i = hash(parser, name) & ((unsigned long)table->size - 1); |
} |
else { |
- unsigned long h = hash(name); |
+ unsigned long h = hash(parser, name); |
unsigned long mask = (unsigned long)table->size - 1; |
unsigned char step = 0; |
i = h & mask; |
@@ -5898,7 +6013,7 @@ lookup(HASH_TABLE *table, KEY name, size_t createSize) |
memset(newV, 0, tsize); |
for (i = 0; i < table->size; i++) |
if (table->v[i]) { |
- unsigned long newHash = hash(table->v[i]->name); |
+ unsigned long newHash = hash(parser, table->v[i]->name); |
size_t j = newHash & newMask; |
step = 0; |
while (newV[j]) { |
@@ -6119,12 +6234,13 @@ poolGrow(STRING_POOL *pool) |
} |
if (pool->blocks && pool->start == pool->blocks->s) { |
int blockSize = (int)(pool->end - pool->start)*2; |
- pool->blocks = (BLOCK *) |
+ BLOCK *temp = (BLOCK *) |
pool->mem->realloc_fcn(pool->blocks, |
(offsetof(BLOCK, s) |
+ blockSize * sizeof(XML_Char))); |
- if (pool->blocks == NULL) |
+ if (temp == NULL) |
return XML_FALSE; |
+ pool->blocks = temp; |
pool->blocks->size = blockSize; |
pool->ptr = pool->blocks->s + (pool->ptr - pool->start); |
pool->start = pool->blocks->s; |
@@ -6273,7 +6389,7 @@ getElementType(XML_Parser parser, |
if (!name) |
return NULL; |
- ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); |
+ ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); |
if (!ret) |
return NULL; |
if (ret->name != name) |