From: Antony Dovgal Date: Fri, 17 Mar 2006 10:15:58 +0000 (+0000) Subject: fix #36743 (In a class extending XMLReader array properties are not writable) X-Git-Tag: php-5.1.3RC2~96 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=652d77eca45e5db0f9256e6bcc4ba2dab5657bd3;p=php fix #36743 (In a class extending XMLReader array properties are not writable) --- diff --git a/NEWS b/NEWS index 8cd01b3b9a..6451c9744a 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,8 @@ PHP NEWS - Added overflow checks to wordwrap() function. (Ilia) - Removed the E_STRICT deprecation notice from "var". (Ilia) - Fixed debug_zval_dump() to support private and protected members. (Dmitry) +- Fixed bug #36743 (In a class extending XMLReader array properties are not + writable). (Tony) - Fixed bug #36697 (Transparency is lost when using imagecreatetruecolor). (Pierre) - Fixed bug #36629 (SoapServer::handle() exits on SOAP faults). (Dmitry) diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 22bf7fdc4d..a662d6086b 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -110,6 +110,40 @@ static int xmlreader_property_reader(xmlreader_object *obj, xmlreader_prop_handl } /* }}} */ +/* {{{ xmlreader_get_property_ptr_ptr */ +zval **xmlreader_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC) +{ + xmlreader_object *obj; + zval tmp_member; + zval **retval = NULL; + xmlreader_prop_handler *hnd; + zend_object_handlers *std_hnd; + int ret = FAILURE; + + if (member->type != IS_STRING) { + tmp_member = *member; + zval_copy_ctor(&tmp_member); + convert_to_string(&tmp_member); + member = &tmp_member; + } + + obj = (xmlreader_object *)zend_objects_get_address(object TSRMLS_CC); + + if (obj->prop_handler != NULL) { + ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); + } + if (ret == FAILURE) { + std_hnd = zend_get_std_object_handlers(); + retval = std_hnd->get_property_ptr_ptr(object, member TSRMLS_CC); + } + + if (member == &tmp_member) { + zval_dtor(member); + } + return retval; +} +/* }}} */ + /* {{{ xmlreader_read_property */ zval *xmlreader_read_property(zval *object, zval *member, int type TSRMLS_DC) { @@ -1098,7 +1132,7 @@ PHP_MINIT_FUNCTION(xmlreader) memcpy(&xmlreader_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); xmlreader_object_handlers.read_property = xmlreader_read_property; xmlreader_object_handlers.write_property = xmlreader_write_property; - xmlreader_object_handlers.get_property_ptr_ptr = NULL; + xmlreader_object_handlers.get_property_ptr_ptr = xmlreader_get_property_ptr_ptr; INIT_CLASS_ENTRY(ce, "XMLReader", xmlreader_functions); ce.create_object = xmlreader_objects_new; diff --git a/ext/xmlreader/tests/bug36743.phpt b/ext/xmlreader/tests/bug36743.phpt new file mode 100644 index 0000000000..45747d49f1 --- /dev/null +++ b/ext/xmlreader/tests/bug36743.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #36743 (In a class extending XMLReader array properties are not writable) +--FILE-- +testArr[] = 1; + var_dump($this->testArr); + } +} + +$t = new test; + +echo "Done\n"; +?> +--EXPECT-- +array(1) { + [0]=> + int(1) +} +Done