summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Walker <dave@mudsite.com>2016-12-20 15:48:43 -0700
committerNikita Popov <nikic@php.net>2016-12-21 21:18:20 +0100
commit5733fd1cafe8d0e2306626c525ad081b7ee30d96 (patch)
tree5ba34ac9fbee9ef854004c6bae60a6b1af419910
parentbecda86ae5dbf7abb1afabd14e84113b2785a345 (diff)
downloadphp-git-5733fd1cafe8d0e2306626c525ad081b7ee30d96.tar.gz
Fix #73753 - Unpacked Arrays and Duplication
-rw-r--r--NEWS1
-rw-r--r--Zend/tests/bug73753.phpt29
-rw-r--r--Zend/zend_hash.c7
3 files changed, 34 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index 98b88cc3f7..53186e79ce 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,7 @@ PHP NEWS
with list()). (Laruence)
. Fixed bug #73585 (Logging of "Internal Zend error - Missing class
information" missing class name). (Laruence)
+ . Fixed bug #73753 (unserialized array pointer not advancing). (David Walker)
- COM:
. Fixed bug #73679 (DOTNET read access violation using invalid codepage).
diff --git a/Zend/tests/bug73753.phpt b/Zend/tests/bug73753.phpt
new file mode 100644
index 0000000000..9a77f62f56
--- /dev/null
+++ b/Zend/tests/bug73753.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Bug #73753 Non packed arrays and duplication
+--FILE--
+<?php
+function iterate($current, $a, $result = null) {
+ if (!$current) {
+ return $result;
+ }
+
+ return iterate(getNext($a), $a, $current);
+}
+
+function getNext(&$a) {
+ return next($a);
+}
+
+function getCurrent($a) {
+ return current($a);
+}
+
+function traverse($a) {
+ return iterate(getCurrent($a), $a);
+}
+
+$arr = array(1 => 'foo', 'b' => 'bar', 'baz');
+var_dump(traverse($arr));
+?>
+--EXPECTF--
+string(3) "baz"
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index aecdac6379..322422da15 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -1757,7 +1757,7 @@ static zend_always_inline void zend_array_dup_packed_elements(HashTable *source,
static zend_always_inline uint32_t zend_array_dup_elements(HashTable *source, HashTable *target, int static_keys, int with_holes)
{
- uint32_t idx = 0;
+ uint32_t idx = 0;
Bucket *p = source->arData;
Bucket *q = target->arData;
Bucket *end = p + source->nNumUsed;
@@ -1785,7 +1785,7 @@ static zend_always_inline uint32_t zend_array_dup_elements(HashTable *source, Ha
ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
{
- uint32_t idx;
+ uint32_t idx;
HashTable *target;
IS_CONSISTENT(source);
@@ -1849,7 +1849,8 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
target->u.flags = (source->u.flags & ~(HASH_FLAG_PERSISTENT|ZEND_HASH_APPLY_COUNT_MASK)) | HASH_FLAG_APPLY_PROTECTION;
target->nTableMask = source->nTableMask;
target->nNextFreeElement = source->nNextFreeElement;
- target->nInternalPointer = HT_INVALID_IDX;
+ target->nInternalPointer = source->nInternalPointer;
+
HT_SET_DATA_ADDR(target, emalloc(HT_SIZE(target)));
HT_HASH_RESET(target);