diff --git a/ext/random/engine_pcgoneseq128xslrr64.c b/ext/random/engine_pcgoneseq128xslrr64.c index 7f15c839d3372..49b72788167de 100644 --- a/ext/random/engine_pcgoneseq128xslrr64.c +++ b/ext/random/engine_pcgoneseq128xslrr64.c @@ -186,6 +186,11 @@ PHP_METHOD(Random_Engine_PcgOneseq128XslRr64, jump) Z_PARAM_LONG(advance); ZEND_PARSE_PARAMETERS_END(); + if (UNEXPECTED(advance < 0)) { + zend_argument_value_error(1, "must be greater than or equal to 0"); + RETURN_THROWS(); + } + php_random_pcgoneseq128xslrr64_advance(state, advance); } /* }}} */ diff --git a/ext/random/tests/02_engine/pcgoneseq128xslrr64_jump_error.phpt b/ext/random/tests/02_engine/pcgoneseq128xslrr64_jump_error.phpt new file mode 100644 index 0000000000000..207c146acb30c --- /dev/null +++ b/ext/random/tests/02_engine/pcgoneseq128xslrr64_jump_error.phpt @@ -0,0 +1,23 @@ +--TEST-- +Random: Engine: PcgOneseq128XslRr64: Jump with negative $advance +--FILE-- +jump(-1); +} catch (ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} + +if ($engine->generate() !== $referenceEngine->generate()) { + die('failure: state changed'); +} + +die('success'); +?> +--EXPECT-- +Random\Engine\PcgOneseq128XslRr64::jump(): Argument #1 ($advance) must be greater than or equal to 0 +success