From b2ec6c24f8b5d8a2767d1fc2557424bf68608b47 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Tue, 23 May 2023 09:54:54 +0200 Subject: [PATCH] Fix exception handling in array_multisort() Closes GH-11302 --- NEWS | 1 + Zend/tests/array_multisort_exception.phpt | 13 +++++++++++++ ext/standard/array.c | 7 +++++-- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/array_multisort_exception.phpt diff --git a/NEWS b/NEWS index 553d8acca6811..d529159d54fe6 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ PHP NEWS - Standard: . Fix access on NULL pointer in array_merge_recursive(). (ilutov) + . Fix exception handling in array_multisort(). (ilutov) 08 Jun 2023, PHP 8.1.20 diff --git a/Zend/tests/array_multisort_exception.phpt b/Zend/tests/array_multisort_exception.phpt new file mode 100644 index 0000000000000..8ee6007745e03 --- /dev/null +++ b/Zend/tests/array_multisort_exception.phpt @@ -0,0 +1,13 @@ +--TEST-- +Exception handling in array_multisort() +--FILE-- + new DateTime(), 0 => new DateTime()]; +array_multisort($array, SORT_STRING); +?> +--EXPECTF-- +Fatal error: Uncaught Error: Object of class DateTime could not be converted to string in %s:%d +Stack trace: +#0 %s(%d): array_multisort(Array, 2) +#1 {main} + thrown in %s on line %d diff --git a/ext/standard/array.c b/ext/standard/array.c index bfd4f95d4137f..86d70a8844e30 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -5598,6 +5598,9 @@ PHP_FUNCTION(array_multisort) /* Do the actual sort magic - bada-bim, bada-boom. */ zend_sort(indirect, array_size, sizeof(Bucket *), php_multisort_compare, (swap_func_t)array_bucket_p_sawp); + if (EG(exception)) { + goto clean_up; + } /* Restructure the arrays based on sorted indirect - this is mostly taken from zend_hash_sort() function. */ for (i = 0; i < num_arrays; i++) { @@ -5623,15 +5626,15 @@ PHP_FUNCTION(array_multisort) zend_hash_rehash(hash); } } + RETVAL_TRUE; - /* Clean up. */ +clean_up: for (i = 0; i < array_size; i++) { efree(indirect[i]); } efree(indirect); efree(func); efree(arrays); - RETURN_TRUE; } /* }}} */