Browse Source

- Fixed bug #48562 (Reference recursion causes segfault when used in wddx_serialize_vars())

experimental/first_unicode_implementation
Felipe Pena 17 years ago
parent
commit
edb136aed3
  1. 22
      ext/wddx/tests/bug48562.phpt
  2. 16
      ext/wddx/wddx.c

22
ext/wddx/tests/bug48562.phpt

@ -0,0 +1,22 @@
--TEST--
Bug #48562 (Reference recursion causes segfault when used in wddx_serialize_vars())
--FILE--
<?php
$foo = 'bar';
$a['x'] = 'foo';
$a['x'] = &$a;
var_dump(wddx_serialize_vars($a));
$a['x'] = 'foo';
$a['x'] = $a;
var_dump(wddx_serialize_vars($a));
?>
--EXPECTF--
Warning: wddx_serialize_vars(): recursion detected in %s on line %d
string(78) "<wddxPacket version='1.0'><header/><data><struct></struct></data></wddxPacket>"
string(120) "<wddxPacket version='1.0'><header/><data><struct><var name='foo'><string>bar</string></var></struct></data></wddxPacket>"

16
ext/wddx/wddx.c

@ -700,13 +700,27 @@ static void php_wddx_add_var(wddx_packet *packet, zval *name_var)
php_wddx_serialize_var(packet, *val, Z_STRVAL_P(name_var), Z_STRLEN_P(name_var) TSRMLS_CC);
}
} else if (Z_TYPE_P(name_var) == IS_ARRAY || Z_TYPE_P(name_var) == IS_OBJECT) {
int is_array = Z_TYPE_P(name_var) == IS_ARRAY;
target_hash = HASH_OF(name_var);
if (is_array && target_hash->nApplyCount > 1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected");
return;
}
zend_hash_internal_pointer_reset(target_hash);
while(zend_hash_get_current_data(target_hash, (void**)&val) == SUCCESS) {
if (is_array) {
target_hash->nApplyCount++;
}
php_wddx_add_var(packet, *val);
if (is_array) {
target_hash->nApplyCount--;
}
zend_hash_move_forward(target_hash);
}
}

Loading…
Cancel
Save