Skip to content

Commit d13cd79

Browse files
committed
random/standard: Correctly handle broken engines in php_array_pick_keys
1 parent 5a988d5 commit d13cd79

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

ext/random/tests/03_randomizer/engine_unsafe_empty_string.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ try {
4343
echo $e->getMessage(), PHP_EOL;
4444
}
4545

46+
try {
47+
var_dump(randomizer()->pickArrayKeys(range(1, 1234), 1));
48+
} catch (Random\BrokenRandomEngineError $e) {
49+
echo $e->getMessage(), PHP_EOL;
50+
}
51+
52+
try {
53+
var_dump(randomizer()->pickArrayKeys(range(1, 1234), 10));
54+
} catch (Random\BrokenRandomEngineError $e) {
55+
echo $e->getMessage(), PHP_EOL;
56+
}
57+
4658
try {
4759
var_dump(randomizer()->shuffleBytes('foobar'));
4860
} catch (Random\BrokenRandomEngineError $e) {
@@ -56,3 +68,5 @@ A random engine must return a non-empty string
5668
A random engine must return a non-empty string
5769
A random engine must return a non-empty string
5870
A random engine must return a non-empty string
71+
A random engine must return a non-empty string
72+
A random engine must return a non-empty string

ext/standard/array.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5833,6 +5833,9 @@ PHPAPI bool php_array_pick_keys(const php_random_algo *algo, php_random_status *
58335833
* specific offset using linear scan. */
58345834
i = 0;
58355835
randval = algo->range(status, 0, num_avail - 1);
5836+
if (EG(exception)) {
5837+
return false;
5838+
}
58365839
ZEND_HASH_FOREACH_KEY(ht, num_key, string_key) {
58375840
if (i == randval) {
58385841
if (string_key) {
@@ -5853,6 +5856,9 @@ PHPAPI bool php_array_pick_keys(const php_random_algo *algo, php_random_status *
58535856
if (HT_IS_PACKED(ht)) {
58545857
do {
58555858
randval = algo->range(status, 0, ht->nNumUsed - 1);
5859+
if (EG(exception)) {
5860+
return false;
5861+
}
58565862
zv = &ht->arPacked[randval];
58575863
if (!Z_ISUNDEF_P(zv)) {
58585864
ZVAL_LONG(retval, randval);
@@ -5862,6 +5868,9 @@ PHPAPI bool php_array_pick_keys(const php_random_algo *algo, php_random_status *
58625868
} else {
58635869
do {
58645870
randval = algo->range(status, 0, ht->nNumUsed - 1);
5871+
if (EG(exception)) {
5872+
return false;
5873+
}
58655874
b = &ht->arData[randval];
58665875
if (!Z_ISUNDEF(b->val)) {
58675876
if (b->key) {
@@ -5896,6 +5905,10 @@ PHPAPI bool php_array_pick_keys(const php_random_algo *algo, php_random_status *
58965905
i = num_req;
58975906
while (i) {
58985907
randval = algo->range(status, 0, num_avail - 1);
5908+
if (EG(exception)) {
5909+
free_alloca(bitset, use_heap);
5910+
return false;
5911+
}
58995912
if (!zend_bitset_in(bitset, randval)) {
59005913
zend_bitset_incl(bitset, randval);
59015914
i--;

0 commit comments

Comments
 (0)