summaryrefslogtreecommitdiff
path: root/ext/wddx
diff options
context:
space:
mode:
authorMark A. Hershberger <mah@debian.(none)>2009-03-25 00:34:37 -0400
committerMark A. Hershberger <mah@debian.(none)>2009-03-25 00:34:37 -0400
commit10f5b47dc7c1cf2b9a00991629f43652710322d3 (patch)
tree3b727a16f652b8042d573e90f003868ffb3b56c7 /ext/wddx
parent0e920280a2e04b110827bb766b9f29e3d581c4ee (diff)
downloadphp-10f5b47dc7c1cf2b9a00991629f43652710322d3.tar.gz
Imported Upstream version 5.0.5upstream/5.0.5
Diffstat (limited to 'ext/wddx')
-rw-r--r--ext/wddx/tests/wddx.xml2
-rw-r--r--ext/wddx/wddx.c37
2 files changed, 32 insertions, 7 deletions
diff --git a/ext/wddx/tests/wddx.xml b/ext/wddx/tests/wddx.xml
index 46ad58d66..00857095c 100644
--- a/ext/wddx/tests/wddx.xml
+++ b/ext/wddx/tests/wddx.xml
@@ -20,7 +20,7 @@
<dateTime>1980-06-12T04:32:12+00</dateTime>
</var>
<var name='aDateTime3'>
- <dateTime>2040-06-12T04:32:12</dateTime>
+ <dateTime>2040-06-12T04:32:12+00</dateTime>
</var>
<var name='aBoolean'>
<boolean value='true'/>
diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c
index 53a55dfcb..2216fb0ff 100644
--- a/ext/wddx/wddx.c
+++ b/ext/wddx/wddx.c
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: wddx.c,v 1.111 2004/06/30 01:12:03 iliaa Exp $ */
+/* $Id: wddx.c,v 1.111.2.3 2005/05/30 15:13:57 sniper Exp $ */
#include "php.h"
@@ -223,7 +223,7 @@ static void release_wddx_packet_rsrc(zend_rsrc_list_entry *rsrc TSRMLS_DC)
#include "ext/session/php_session.h"
-#if HAVE_PHP_SESSION
+#if HAVE_PHP_SESSION && !defined(COMPILE_DL_SESSION)
/* {{{ PS_SERIALIZER_ENCODE_FUNC
*/
PS_SERIALIZER_ENCODE_FUNC(wddx)
@@ -302,7 +302,7 @@ PHP_MINIT_FUNCTION(wddx)
{
le_wddx = zend_register_list_destructors_ex(release_wddx_packet_rsrc, NULL, "wddx", module_number);
-#if HAVE_PHP_SESSION
+#if HAVE_PHP_SESSION && !defined(COMPILE_DL_SESSION)
php_session_register_serializer("wddx",
PS_SERIALIZER_ENCODE_NAME(wddx),
PS_SERIALIZER_DECODE_NAME(wddx));
@@ -317,7 +317,7 @@ PHP_MINIT_FUNCTION(wddx)
PHP_MINFO_FUNCTION(wddx)
{
php_info_print_table_start();
-#if HAVE_PHP_SESSION
+#if HAVE_PHP_SESSION && !defined(COMPILE_DL_SESSION)
php_info_print_table_header(2, "WDDX Support", "enabled" );
php_info_print_table_row(2, "WDDX Session Serializer", "enabled" );
#else
@@ -522,7 +522,10 @@ static void php_wddx_serialize_object(wddx_packet *packet, zval *obj)
continue;
if (zend_hash_get_current_key_ex(HASH_OF(obj), &key, &key_len, &idx, 0, NULL) == HASH_KEY_IS_STRING) {
- php_wddx_serialize_var(packet, *ent, key, key_len TSRMLS_CC);
+ char *class_name, *prop_name;
+
+ zend_unmangle_property_name(key, &class_name, &prop_name);
+ php_wddx_serialize_var(packet, *ent, prop_name, strlen(prop_name)+1 TSRMLS_CC);
} else {
key_len = sprintf(tmp_buf, "%ld", idx);
php_wddx_serialize_var(packet, *ent, tmp_buf, key_len TSRMLS_CC);
@@ -617,6 +620,7 @@ void php_wddx_serialize_var(wddx_packet *packet, zval *var, char *name, int name
char tmp_buf[WDDX_BUF_LEN];
char *name_esc;
int name_esc_len;
+ HashTable *ht;
if (name) {
name_esc = php_escape_html_entities(name, name_len, &name_esc_len, 0, ENT_QUOTES, NULL TSRMLS_CC);
@@ -644,11 +648,25 @@ void php_wddx_serialize_var(wddx_packet *packet, zval *var, char *name, int name
break;
case IS_ARRAY:
+ ht = Z_ARRVAL_P(var);
+ if (ht->nApplyCount > 1) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "WDDX doesn't support circular references");
+ return;
+ }
+ ht->nApplyCount++;
php_wddx_serialize_array(packet, var);
+ ht->nApplyCount--;
break;
case IS_OBJECT:
- php_wddx_serialize_object(packet, var);
+ ht = Z_OBJPROP_P(var);
+ if (ht->nApplyCount > 1) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "WDDX doesn't support circular references");
+ return;
+ }
+ ht->nApplyCount++;
+ php_wddx_serialize_object(packet, var);
+ ht->nApplyCount--;
break;
}
@@ -972,6 +990,13 @@ static void php_wddx_pop_element(void *user_data, const XML_Char *name)
/* Clean up class name var entry */
zval_ptr_dtor(&ent1->data);
+ } else if (Z_TYPE_P(ent2->data) == IS_OBJECT) {
+ zend_class_entry *old_scope = EG(scope);
+
+ EG(scope) = Z_OBJCE_P(ent2->data);
+ ent1->data->refcount--;
+ add_property_zval(ent2->data, ent1->varname, ent1->data);
+ EG(scope) = old_scope;
} else
zend_hash_update(target_hash,
ent1->varname, strlen(ent1->varname)+1,