[php-src] Issue #9244: Segfault with array_multisort + array_shift (packed arrays?)

From: Date: Wed, 03 Aug 2022 15:21:56 +0000
Subject: [php-src] Issue #9244: Segfault with array_multisort + array_shift (packed arrays?)
Groups: php.bugs 
Request: Send a blank email to php-bugs+get-242118@lists.php.net to get a copy of this message
Issue: https://github.com/php/php-src/issues/9244 Author: chschneider ### Description The following code: ```php <?php $items = ['foo' => 1, 'bar' => 2]; $order = [4, 3]; array_multisort($order, $items); var_dump(array_shift($items)); ``` Resulted in this output: ``` Segmentation fault (core dumped) ``` But I expected this output instead: ``` int(2) ``` After bisecting the relevant commit seems to be ``` commit 90b7bde61507cee1c6b37f153909d72f5b203b8c Author: Dmitry Stogov <dmitry@zend.com> Date: Wed Nov 3 15:18:26 2021 +0300 Use more compact representation for packed arrays. - for packed arrays we store just an array of zvals without keys. - the elements of packed array are accessible throuf as ht->arPacked[i] instead of ht->arData[i] - in addition to general ZEND_HASH_FOREACH_* macros, we introduced similar familied for packed (ZEND_HASH_PACKED_FORECH_*) and real hashes (ZEND_HASH_MAP_FOREACH_*) - introduced an additional family of macros to access elements of array (packed or real hashes) ZEND_ARRAY_ELEMET_SIZE, ZEND_ARRAY_ELEMET_EX, ZEND_ARRAY_ELEMET, ZEND_ARRAY_NEXT_ELEMENT, ZEND_ARRAY_PREV_ELEMENT - zend_hash_minmax() prototype was changed to compare only values Because of smaller data set, this patch may show performance improvement on some apps and benchmarks that use packed arrays. (~1% on PHP-Parser) TODO: - sapi/phpdbg needs special support for packed arrays (WATCH_ON_BUCKET). - zend_hash_sort_ex() may require converting packed arrays to hash. ``` This commit is too complex for me to come up with a fix. But the last TODO mentioned in the commit message could be an indication of what is going wrong. ### PHP Version PHP 8.2.0-dev ### Operating System openSUSE Leap 15.3

« previous php.bugs (#242118) next »