summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Richards <rrichards@php.net>2004-11-18 20:16:45 +0000
committerRob Richards <rrichards@php.net>2004-11-18 20:16:45 +0000
commit40d830935416ca1b4c9d67a0d681d7095a4d7664 (patch)
tree630354ca7f73f612846d5e575fe2ba50cb935b96
parent62f3ccdea9d03147231a5bf6f496398015c20ec2 (diff)
downloadphp-git-40d830935416ca1b4c9d67a0d681d7095a4d7664.tar.gz
MFH: Fixed bug #30061 (xml_set_start_namespace_decl_handler not called)
hopefully resolve a bunch of entity issues
-rw-r--r--ext/xml/compat.c57
1 files changed, 41 insertions, 16 deletions
diff --git a/ext/xml/compat.c b/ext/xml/compat.c
index d2154929a5..72a9b4ed01 100644
--- a/ext/xml/compat.c
+++ b/ext/xml/compat.c
@@ -76,6 +76,14 @@ _start_element_handler_ns(void *user, const xmlChar *name, const xmlChar *prefix
int z = 0;
int y = 0;
+ if (nb_namespaces > 0 && parser->h_start_ns != NULL) {
+ for (i = 0; i < nb_namespaces; i += 1) {
+ parser->h_start_ns(parser->user, (const XML_Char *) namespaces[y], (const XML_Char *) namespaces[y+1]);
+ y += 2;
+ }
+ y = 0;
+ }
+
if (parser->h_start_element == NULL) {
return;
}
@@ -247,33 +255,49 @@ _build_entity(const xmlChar *name, int len, xmlChar **entity, int *entity_len)
(*entity)[*entity_len] = '\0';
}
-static xmlEntityPtr
-_get_entity(void *user, const xmlChar *name)
+static void
+_external_entity_ref_handler(void *user, const xmlChar *names, int type, const xmlChar *sys_id, const xmlChar *pub_id, xmlChar *content)
{
XML_Parser parser = (XML_Parser) user;
- if (parser->h_default) {
- xmlChar *entity;
- int len;
-
- _build_entity(name, xmlStrlen(name), &entity, &len);
- parser->h_default(parser->user, (const xmlChar *) entity, len);
- xmlFree(entity);
+ if (parser->h_external_entity_ref == NULL) {
+ return;
}
- return NULL;
+ parser->h_external_entity_ref(parser, names, "", sys_id, pub_id);
}
-static void
-_external_entity_ref_handler(void *user, const xmlChar *names, int type, const xmlChar *sys_id, const xmlChar *pub_id, xmlChar *content)
+static xmlEntityPtr
+_get_entity(void *user, const xmlChar *name)
{
XML_Parser parser = (XML_Parser) user;
+ xmlEntityPtr ret = NULL;
- if (parser->h_external_entity_ref == NULL) {
- return;
+ if (parser->parser->inSubset == 0) {
+ ret = xmlGetPredefinedEntity(name);
+ if (ret == NULL)
+ ret = xmlGetDocEntity(parser->parser->myDoc, name);
+
+
+ if (ret == NULL || (parser->parser->instate != XML_PARSER_ENTITY_VALUE && parser->parser->instate != XML_PARSER_ATTRIBUTE_VALUE)) {
+ if (ret == NULL || ret->etype == XML_INTERNAL_GENERAL_ENTITY || ret->etype == XML_INTERNAL_PARAMETER_ENTITY || ret->etype == XML_INTERNAL_PREDEFINED_ENTITY) {
+ if (parser->h_default) {
+ xmlChar *entity;
+ int len;
+
+ _build_entity(name, xmlStrlen(name), &entity, &len);
+ parser->h_default(parser->user, (const xmlChar *) entity, len);
+ xmlFree(entity);
+ }
+ } else {
+ if (ret->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) {
+ _external_entity_ref_handler(user, ret->name, ret->etype, ret->SystemID, ret->ExternalID, NULL);
+ }
+ }
+ }
}
- parser->h_external_entity_ref(parser, names, "", sys_id, pub_id);
+ return ret;
}
static xmlSAXHandler
@@ -284,7 +308,7 @@ php_xml_compat_handlers = {
NULL, /* hasExternalSubset */
NULL, /* resolveEntity */
_get_entity, /* getEntity */
- _external_entity_ref_handler, /* entityDecl */
+ NULL, /* entityDecl */
_notation_decl_handler,
NULL, /* attributeDecl */
NULL, /* elementDecl */
@@ -353,6 +377,7 @@ XML_ParserCreate_MM(const XML_Char *encoding, const XML_Memory_Handling_Suite *m
parser->parser->charset = XML_CHAR_ENCODING_NONE;
}
parser->parser->replaceEntities = 1;
+ parser->parser->wellFormed = 0;
if (sep != NULL) {
parser->use_namespace = 1;
#if LIBXML_VERSION >= 20600