Browse Source

- #46497, wddx_serialize treats input as ISO-8859-1 (Mark Karpeles)

PHP-5.2.1RC1
Pierre Joye 18 years ago
parent
commit
fa0e88725c
  1. 776
      ext/wddx/tests/bug37569.phpt
  2. 6
      ext/wddx/tests/bug37587.phpt
  3. 45
      ext/wddx/wddx.c

776
ext/wddx/tests/bug37569.phpt
File diff suppressed because it is too large
View File

6
ext/wddx/tests/bug37587.phpt

@ -5,8 +5,8 @@ Bug #37587 (var without attribute causes segfault)
--FILE-- --FILE--
<?php <?php
var_dump(wddx_deserialize(file_get_contents(<<<EOF
data:,<wddxPacket version='1.0'>
var_dump(wddx_deserialize(<<<EOF
<wddxPacket version='1.0'>
<header/> <header/>
<data> <data>
<array length='1'> <array length='1'>
@ -19,7 +19,7 @@ data:,<wddxPacket version='1.0'>
</data> </data>
</wddxPacket> </wddxPacket>
EOF EOF
)));
));
?> ?>
===DONE=== ===DONE===

45
ext/wddx/wddx.c

@ -371,16 +371,14 @@ static void php_wddx_serialize_string(wddx_packet *packet, zval *var TSRMLS_DC)
php_wddx_add_chunk_static(packet, WDDX_STRING_S); php_wddx_add_chunk_static(packet, WDDX_STRING_S);
if (Z_STRLEN_P(var) > 0) { if (Z_STRLEN_P(var) > 0) {
char *buf, *enc;
int buf_len, enc_len;
char *buf;
int buf_len;
buf = php_escape_html_entities(Z_STRVAL_P(var), Z_STRLEN_P(var), &buf_len, 0, ENT_QUOTES, NULL TSRMLS_CC); buf = php_escape_html_entities(Z_STRVAL_P(var), Z_STRLEN_P(var), &buf_len, 0, ENT_QUOTES, NULL TSRMLS_CC);
enc = xml_utf8_encode(buf, buf_len, &enc_len, "ISO-8859-1");
php_wddx_add_chunk_ex(packet, enc, enc_len);
php_wddx_add_chunk_ex(packet, buf, buf_len);
efree(buf); efree(buf);
efree(enc);
} }
php_wddx_add_chunk_static(packet, WDDX_STRING_E); php_wddx_add_chunk_static(packet, WDDX_STRING_E);
} }
@ -786,10 +784,7 @@ static void php_wddx_push_element(void *user_data, const XML_Char *name, const X
if (atts) for (i = 0; atts[i]; i++) { if (atts) for (i = 0; atts[i]; i++) {
if (!strcmp(atts[i], EL_NAME) && atts[++i] && atts[i][0]) { if (!strcmp(atts[i], EL_NAME) && atts[++i] && atts[i][0]) {
char *decoded;
int decoded_len;
decoded = xml_utf8_decode(atts[i], strlen(atts[i]), &decoded_len, "ISO-8859-1");
stack->varname = decoded;
stack->varname = estrdup(atts[i]);
break; break;
} }
} }
@ -806,12 +801,9 @@ static void php_wddx_push_element(void *user_data, const XML_Char *name, const X
zval *tmp; zval *tmp;
char *key; char *key;
char *p1, *p2, *endp; char *p1, *p2, *endp;
char *decoded;
int decoded_len;
decoded = xml_utf8_decode(atts[i], strlen(atts[i]), &decoded_len, "ISO-8859-1");
endp = (char *)decoded + decoded_len;
p1 = (char *)decoded;
endp = (char *)atts[i] + strlen(atts[i]);
p1 = (char *)atts[i];
while ((p2 = php_memnstr(p1, ",", sizeof(",")-1, endp)) != NULL) { while ((p2 = php_memnstr(p1, ",", sizeof(",")-1, endp)) != NULL) {
key = estrndup(p1, p2 - p1); key = estrndup(p1, p2 - p1);
MAKE_STD_ZVAL(tmp); MAKE_STD_ZVAL(tmp);
@ -827,7 +819,6 @@ static void php_wddx_push_element(void *user_data, const XML_Char *name, const X
add_assoc_zval_ex(ent.data, p1, endp - p1 + 1, tmp); add_assoc_zval_ex(ent.data, p1, endp - p1 + 1, tmp);
} }
efree(decoded);
break; break;
} }
} }
@ -843,19 +834,15 @@ static void php_wddx_push_element(void *user_data, const XML_Char *name, const X
if (atts) for (i = 0; atts[i]; i++) { if (atts) for (i = 0; atts[i]; i++) {
if (!strcmp(atts[i], EL_NAME) && atts[++i] && atts[i][0]) { if (!strcmp(atts[i], EL_NAME) && atts[++i] && atts[i][0]) {
char *decoded;
int decoded_len;
st_entry *recordset; st_entry *recordset;
zval **field; zval **field;
decoded = xml_utf8_decode(atts[i], strlen(atts[i]), &decoded_len, "ISO-8859-1");
if (wddx_stack_top(stack, (void**)&recordset) == SUCCESS && if (wddx_stack_top(stack, (void**)&recordset) == SUCCESS &&
recordset->type == ST_RECORDSET && recordset->type == ST_RECORDSET &&
zend_hash_find(Z_ARRVAL_P(recordset->data), decoded, decoded_len+1, (void**)&field) == SUCCESS) {
zend_hash_find(Z_ARRVAL_P(recordset->data), (char*)atts[i], strlen(atts[i])+1, (void**)&field) == SUCCESS) {
ent.data = *field; ent.data = *field;
} }
efree(decoded);
break; break;
} }
} }
@ -1006,28 +993,22 @@ static void php_wddx_process_data(void *user_data, const XML_Char *s, int len)
{ {
st_entry *ent; st_entry *ent;
wddx_stack *stack = (wddx_stack *)user_data; wddx_stack *stack = (wddx_stack *)user_data;
char *decoded;
int decoded_len;
TSRMLS_FETCH(); TSRMLS_FETCH();
if (!wddx_stack_is_empty(stack) && !stack->done) { if (!wddx_stack_is_empty(stack) && !stack->done) {
wddx_stack_top(stack, (void**)&ent); wddx_stack_top(stack, (void**)&ent);
switch (Z_TYPE_P(ent)) { switch (Z_TYPE_P(ent)) {
case ST_STRING: case ST_STRING:
decoded = xml_utf8_decode(s, len, &decoded_len, "ISO-8859-1");
if (Z_STRLEN_P(ent->data) == 0) { if (Z_STRLEN_P(ent->data) == 0) {
STR_FREE(Z_STRVAL_P(ent->data)); STR_FREE(Z_STRVAL_P(ent->data));
Z_STRVAL_P(ent->data) = estrndup(decoded, decoded_len);
Z_STRLEN_P(ent->data) = decoded_len;
Z_STRVAL_P(ent->data) = estrndup(s, len);
Z_STRLEN_P(ent->data) = len;
} else { } else {
Z_STRVAL_P(ent->data) = erealloc(Z_STRVAL_P(ent->data), Z_STRLEN_P(ent->data) + decoded_len + 1);
memcpy(Z_STRVAL_P(ent->data) + Z_STRLEN_P(ent->data), decoded, decoded_len);
Z_STRLEN_P(ent->data) += decoded_len;
Z_STRVAL_P(ent->data) = erealloc(Z_STRVAL_P(ent->data), Z_STRLEN_P(ent->data) + len + 1);
memcpy(Z_STRVAL_P(ent->data) + Z_STRLEN_P(ent->data), s, len);
Z_STRLEN_P(ent->data) += len;
Z_STRVAL_P(ent->data)[Z_STRLEN_P(ent->data)] = '\0'; Z_STRVAL_P(ent->data)[Z_STRLEN_P(ent->data)] = '\0';
} }
efree(decoded);
break; break;
case ST_BINARY: case ST_BINARY:
@ -1098,7 +1079,7 @@ int php_wddx_deserialize_ex(char *value, int vallen, zval *return_value)
int retval; int retval;
wddx_stack_init(&stack); wddx_stack_init(&stack);
parser = XML_ParserCreate("ISO-8859-1");
parser = XML_ParserCreate("UTF-8");
XML_SetUserData(parser, &stack); XML_SetUserData(parser, &stack);
XML_SetElementHandler(parser, php_wddx_push_element, php_wddx_pop_element); XML_SetElementHandler(parser, php_wddx_push_element, php_wddx_pop_element);

Loading…
Cancel
Save