diff --git a/ext/random/engine_user.c b/ext/random/engine_user.c index 1249146b50539..1b86c93d0ac55 100644 --- a/ext/random/engine_user.c +++ b/ext/random/engine_user.c @@ -30,6 +30,11 @@ static uint64_t generate(php_random_status *status) zend_call_known_instance_method_with_0_params(s->generate_method, s->object, &retval); + if (EG(exception)) { + status->last_unsafe = true; + return 0; + } + /* Store generated size in a state */ size = Z_STRLEN(retval); diff --git a/ext/random/tests/03_randomizer/user_exits.phpt b/ext/random/tests/03_randomizer/user_exits.phpt new file mode 100644 index 0000000000000..6d6f5636cbec4 --- /dev/null +++ b/ext/random/tests/03_randomizer/user_exits.phpt @@ -0,0 +1,19 @@ +--TEST-- +Random: Randomizer: User: Engine exits +--FILE-- +getBytes(1)); + +?> +--EXPECT-- +Exit diff --git a/ext/random/tests/03_randomizer/user_throws.phpt b/ext/random/tests/03_randomizer/user_throws.phpt new file mode 100644 index 0000000000000..c0708e0514419 --- /dev/null +++ b/ext/random/tests/03_randomizer/user_throws.phpt @@ -0,0 +1,29 @@ +--TEST-- +Random: Randomizer: User: Engine throws +--FILE-- +getBytes(1)); + +?> +--EXPECTF-- +Fatal error: Uncaught Exception: Error in %s:%d +Stack trace: +#0 [internal function]: Random\Engine@anonymous->generate() +#1 %s(%d): Random\Randomizer->getBytes(1) +#2 {main} + +Next RuntimeException: Random number generation failed in %s:%d +Stack trace: +#0 %s(%d): Random\Randomizer->getBytes(1) +#1 {main} + thrown in %s on line %d