Skip to content

Commit e9a447f

Browse files
committed
random: fix __construct() call twice
1 parent 133b9b0 commit e9a447f

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

ext/random/randomizer.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static inline void randomizer_common_init(php_random_randomizer *randomizer, zen
4242
zend_string *mname;
4343
zend_function *generate_method;
4444

45-
mname = zend_string_init("generate", strlen("generate"), 0);
45+
mname = zend_string_init("generate", sizeof("generate") - 1, 0);
4646
generate_method = zend_hash_find_ptr(&engine_object->ce->function_table, mname);
4747
zend_string_release(mname);
4848

@@ -70,6 +70,11 @@ PHP_METHOD(Random_Randomizer, __construct)
7070
Z_PARAM_OBJ_OF_CLASS_OR_NULL(engine_object, random_ce_Random_Engine);
7171
ZEND_PARSE_PARAMETERS_END();
7272

73+
if (randomizer->algo) {
74+
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot call constructor twice");
75+
RETURN_THROWS();
76+
}
77+
7378
/* Create default RNG instance */
7479
if (!engine_object) {
7580
engine_object = random_ce_Random_Engine_Secure->create_object(random_ce_Random_Engine_Secure);
@@ -80,7 +85,7 @@ PHP_METHOD(Random_Randomizer, __construct)
8085

8186
ZVAL_OBJ(&zengine_object, engine_object);
8287

83-
zend_update_property(random_ce_Random_Randomizer, Z_OBJ_P(ZEND_THIS), "engine", strlen("engine"), &zengine_object);
88+
zend_update_property(random_ce_Random_Randomizer, Z_OBJ_P(ZEND_THIS), "engine", sizeof("engine") - 1, &zengine_object);
8489

8590
randomizer_common_init(randomizer, engine_object);
8691
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
--TEST--
2+
Random: Randomizer: __construct() twice
3+
--FILE--
4+
<?php
5+
try {
6+
(new \Random\Randomizer())->__construct();
7+
} catch (\BadMethodCallException $e) {
8+
echo $e->getMessage() . PHP_EOL;
9+
}
10+
11+
try {
12+
(new \Random\Randomizer(
13+
new class () implements \Random\Engine {
14+
public function generate(): string
15+
{
16+
return \random_bytes(4); /* 32-bit */
17+
}
18+
}
19+
))->__construct(
20+
new class () implements \Random\Engine {
21+
public function generate(): string
22+
{
23+
return \random_bytes(4); /* 32-bit */
24+
}
25+
}
26+
);
27+
} catch (\BadMethodCallException $e) {
28+
echo $e->getMessage() . PHP_EOL;
29+
}
30+
31+
die('success');
32+
?>
33+
--EXPECT--
34+
Cannot call constructor twice
35+
Cannot call constructor twice
36+
success

0 commit comments

Comments
 (0)