From 1f34ccbe34783f5671bc2a68e7299cea7493c82b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 3 Apr 2013 20:29:19 +0200 Subject: [PATCH] Fix bug #64555: foreach no longer copies keys if they are interned --- NEWS | 2 ++ Zend/tests/bug64555.phpt | 42 ++++++++++++++++++++++++++++++++++++++++ Zend/zend_hash.c | 2 +- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/bug64555.phpt diff --git a/NEWS b/NEWS index 7e83b30d78..974df5e9ed 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,8 @@ PHP NEWS - Core: . Fixed bug #64565 (copy doesn't report failure on partial copy). (Remi) + . Fixed bug #64555 (foreach no longer copies keys if they are interned). + (Nikita Popov) - CURL: . Added CURL_WRAPPERS_ENABLE constant. (Laruence) diff --git a/Zend/tests/bug64555.phpt b/Zend/tests/bug64555.phpt new file mode 100644 index 0000000000..d5226af7a9 --- /dev/null +++ b/Zend/tests/bug64555.phpt @@ -0,0 +1,42 @@ +--TEST-- +Bug #64555: Array key within interned string gets wrong hash value +--FILE-- + $v) { + if ($k == 'unsetme') { + echo "Unsetting: $k\n"; + unset($a[$k]); + } else if ($k == 'keepme') { + echo "Changing: $k\n"; + $a[$k] = 42; + $a['keepme'] = 43; + } + } + + var_dump($a, array_keys($a)); + } +} + +$f = new Foo; +$f->test(); + +?> +--EXPECT-- +Unsetting: unsetme +Changing: keepme +array(1) { + ["keepme"]=> + int(43) +} +array(1) { + [0]=> + string(6) "keepme" +} diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index bca47b330f..27b603eed2 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -1182,7 +1182,7 @@ ZEND_API void zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, Z_TYPE_P(key) = IS_NULL; } else if (p->nKeyLength) { Z_TYPE_P(key) = IS_STRING; - Z_STRVAL_P(key) = IS_INTERNED(p->arKey) ? (char *) p->arKey : estrndup(p->arKey, p->nKeyLength - 1); + Z_STRVAL_P(key) = estrndup(p->arKey, p->nKeyLength - 1); Z_STRLEN_P(key) = p->nKeyLength - 1; } else { Z_TYPE_P(key) = IS_LONG; -- 2.50.1