summaryrefslogtreecommitdiff
path: root/ext/xml
diff options
context:
space:
mode:
authorThies C. Arntzen <thies@php.net>1999-10-20 14:58:03 +0000
committerThies C. Arntzen <thies@php.net>1999-10-20 14:58:03 +0000
commit604c14ab00fb6920c7bafd89c4701d0a44542ed3 (patch)
tree34977254fe71e5ffd8a53bbef406e26599f4488a /ext/xml
parent41b87a238eb5b9a33c46d8d264d4e97c5d4acffa (diff)
downloadphp-git-604c14ab00fb6920c7bafd89c4701d0a44542ed3.tar.gz
(PHP xml_parse_into_struct) sometimes the value was truncated
@- XML_Parse_Into_Struct no longer eats data. (Thies)
Diffstat (limited to 'ext/xml')
-rw-r--r--ext/xml/xml.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/ext/xml/xml.c b/ext/xml/xml.c
index 66e1fe6dbb..bfcc14b403 100644
--- a/ext/xml/xml.c
+++ b/ext/xml/xml.c
@@ -814,7 +814,19 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
}
if (doprint || (! parser->skipwhite)) {
if (parser->lastwasopen) {
- add_assoc_string(*(parser->ctag),"value",decoded_value,0);
+ zval **myval;
+
+ /* check if the current tag already has a value - if yes append to that! */
+ if (zend_hash_find((*parser->ctag)->value.ht,"value",sizeof("value"),(void **) &myval) == SUCCESS) {
+ int newlen = (*myval)->value.str.len + decoded_len;
+ (*myval)->value.str.val = erealloc((*myval)->value.str.val,newlen);
+ strcpy((*myval)->value.str.val + (*myval)->value.str.len,decoded_value);
+ (*myval)->value.str.len += decoded_len;
+ efree(decoded_value);
+ } else {
+ add_assoc_string(*(parser->ctag),"value",decoded_value,0);
+ }
+
} else {
zval *tag;
@@ -828,7 +840,7 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
add_assoc_string(tag,"value",decoded_value,0);
add_assoc_string(tag,"type","cdata",1);
add_assoc_long(tag,"level",parser->level);
-
+
zend_hash_next_index_insert(parser->data->value.ht,&tag,sizeof(zval*),NULL);
}
} else {