summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2010-12-10 23:58:33 +0000
committerFelipe Pena <felipe@php.net>2010-12-10 23:58:33 +0000
commit9864040e354226e53c4adf74740a520604206166 (patch)
tree4f4cc7567e82c8765e6039ea6e83f440b635320c
parentcccba0fa4daed884cfa0aad39115f35acbdcbd50 (diff)
downloadphp-git-9864040e354226e53c4adf74740a520604206166.tar.gz
- Fixed bug #53515 (property_exists incorrect on ArrayObject null and 0 values)
-rw-r--r--NEWS10
-rwxr-xr-xext/spl/spl_array.c22
-rw-r--r--ext/spl/tests/bug53515.phpt27
3 files changed, 52 insertions, 7 deletions
diff --git a/NEWS b/NEWS
index 06e28efcf8..69f34c55f6 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,10 @@
PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 20??, PHP 5.3.5
+- Zend Engine:
+ . Indirect reference to $this fails to resolve if direct $this is never used
+ in method. (Scott)
+
- Intl extension:
. Fixed bug #53512 (NumberFormatter::setSymbol crash on bogus $attr values).
(Felipe)
@@ -13,9 +17,9 @@
. Fixed bug #53517 (segfault in pgsql_stmt_execute() when postgres is down).
(gyp at balabit dot hu)
-- Zend Engine:
- . Indirect reference to $this fails to resolve if direct $this is never used
- in method. (Scott)
+- SPL extension:
+ . Fixed bug #53515 (property_exists incorrect on ArrayObject null and 0
+ values). (Felipe)
09 Dec 2010, PHP 5.3.4
- Upgraded bundled Sqlite3 to version 3.7.3. (Ilia)
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index d355546cf1..eb39cca1f6 100755
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -579,8 +579,15 @@ static int spl_array_has_dimension_ex(int check_inherited, zval *object, zval *o
switch(Z_TYPE_P(offset)) {
case IS_STRING:
if (check_empty) {
- if (zend_symtable_find(spl_array_get_hash_table(intern, 0 TSRMLS_CC), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **) &tmp) != FAILURE && zend_is_true(*tmp)) {
- return 1;
+ if (zend_symtable_find(spl_array_get_hash_table(intern, 0 TSRMLS_CC), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **) &tmp) != FAILURE) {
+ switch (check_empty) {
+ case 0:
+ return Z_TYPE_PP(tmp) != IS_NULL;
+ case 2:
+ return 1;
+ default:
+ return zend_is_true(*tmp);
+ }
}
return 0;
} else {
@@ -597,8 +604,15 @@ static int spl_array_has_dimension_ex(int check_inherited, zval *object, zval *o
}
if (check_empty) {
HashTable *ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
- if (zend_hash_index_find(ht, index, (void **)&tmp) != FAILURE && zend_is_true(*tmp)) {
- return 1;
+ if (zend_hash_index_find(ht, index, (void **)&tmp) != FAILURE) {
+ switch (check_empty) {
+ case 0:
+ return Z_TYPE_PP(tmp) != IS_NULL;
+ case 2:
+ return 1;
+ default:
+ return zend_is_true(*tmp);
+ }
}
return 0;
} else {
diff --git a/ext/spl/tests/bug53515.phpt b/ext/spl/tests/bug53515.phpt
new file mode 100644
index 0000000000..f99840e322
--- /dev/null
+++ b/ext/spl/tests/bug53515.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #53515 (property_exists incorrect on ArrayObject null and 0 values)
+--FILE--
+<?php
+
+$a = array('a' => 1, 'b'=> true, 'c' => 0, 'd' => null, 'e' => false, 'f' => array());
+$o = new ArrayObject($a, ArrayObject::ARRAY_AS_PROPS);
+
+$a['z'] = '';
+$a[''] = '';
+
+foreach ($a as $key => $value) {
+ echo $key . ': ' . (is_null($value) ? 'null' : $value) .
+ ' array_key_exists: ' . (array_key_exists($key, $a) ? 'true' : 'false') .
+ ' property_exists: ' . (property_exists($o, $key) ? 'true' : 'false'),"\n";
+}
+
+?>
+--EXPECT--
+a: 1 array_key_exists: true property_exists: true
+b: 1 array_key_exists: true property_exists: true
+c: 0 array_key_exists: true property_exists: true
+d: null array_key_exists: true property_exists: true
+e: array_key_exists: true property_exists: true
+f: Array array_key_exists: true property_exists: true
+z: array_key_exists: true property_exists: false
+: array_key_exists: true property_exists: false