]> granicus.if.org Git - php/commitdiff
- MFH: Fixed bug #48562 (Reference recursion causes segfault when used in wddx_serial...
authorFelipe Pena <felipe@php.net>
Tue, 16 Jun 2009 02:54:26 +0000 (02:54 +0000)
committerFelipe Pena <felipe@php.net>
Tue, 16 Jun 2009 02:54:26 +0000 (02:54 +0000)
ext/wddx/tests/bug48562.phpt [new file with mode: 0644]
ext/wddx/wddx.c

diff --git a/ext/wddx/tests/bug48562.phpt b/ext/wddx/tests/bug48562.phpt
new file mode 100644 (file)
index 0000000..d9ae376
--- /dev/null
@@ -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>"
index e1139f8422b5ddf8d83829e9345b20ed53ba0667..cd7e01a1eff41dbe5121541d105400c15e8feb37 100644 (file)
@@ -704,13 +704,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);
                }
        }