Skip to content

Commit 0b3d5ba

Browse files
committed
fix Randomizer::getBytes
1 parent 6ed22dc commit 0b3d5ba

File tree

2 files changed

+44
-9
lines changed

2 files changed

+44
-9
lines changed

ext/random/random.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,8 @@ PHP_METHOD(Random_Randomizer, getBytes)
15311531
php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
15321532
zend_string *retval;
15331533
zend_long length;
1534-
size_t generated_size = 0;
1534+
size_t total_size = 0;
1535+
size_t required_size;
15351536
int i;
15361537

15371538
ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -1544,19 +1545,22 @@ PHP_METHOD(Random_Randomizer, getBytes)
15441545
}
15451546

15461547
retval = zend_string_alloc(length, 0);
1548+
required_size = length * sizeof(char);
15471549

1548-
while (generated_size < (length * sizeof(char))) {
1549-
uint64_t generated;
1550-
size_t generate_size;
1550+
while (total_size < required_size) {
1551+
uint64_t result;
1552+
size_t generated_size;
15511553

1552-
RANDOM_ENGINE_GENERATE_SIZE(randomizer->algo, randomizer->state, generated, generate_size);
1554+
RANDOM_ENGINE_GENERATE_SIZE(randomizer->algo, randomizer->state, result, generated_size);
15531555

1554-
for (i = 0; i < generate_size; i++) {
1555-
ZSTR_VAL(retval)[i] = (generated >> (i * 8)) & 0xff;
1556+
for (i = 0; i < generated_size; i++) {
1557+
ZSTR_VAL(retval)[total_size++] = (result >> (i * sizeof(char)) & 0xff);
1558+
if (total_size >= required_size) {
1559+
break;
1560+
}
15561561
}
1557-
1558-
generated_size += generate_size;
15591562
}
1563+
15601564
ZSTR_VAL(retval)[length] = '\0';
15611565
RETURN_STR(retval);
15621566
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--TEST--
2+
Random: Randomizer: getBytes
3+
--FILE--
4+
<?php
5+
6+
$randomizer = new \Random\Randomizer (
7+
new class () implements \Random\Engine
8+
{
9+
private int $count = 0;
10+
11+
public function generate(): string
12+
{
13+
return match ($this->count++) {
14+
0 => 'H',
15+
1 => 'e',
16+
2 => 'l',
17+
3 => 'l',
18+
4 => 'o',
19+
};
20+
}
21+
}
22+
);
23+
24+
if ($randomizer->getBytes(5) !== 'Hello') {
25+
die('failure');
26+
}
27+
28+
die('success');
29+
?>
30+
--EXPECTF--
31+
success

0 commit comments

Comments
 (0)