diff --git a/NEWS b/NEWS index e755d98d18aee..f55f604503334 100644 --- a/NEWS +++ b/NEWS @@ -49,6 +49,8 @@ PHP NEWS for invalid $mode. (timwolla) . Splitted Random\Randomizer::getInt() (without arguments) to Random\Randomizer::nextInt(). (zeriyoshi) + . Removed redundant RuntimeExceptions from Randomizer methods. The + exceptions thrown by the engines will be exposed directly. (timwolla) - Sockets: . Added SOL_FILTER socket option for Solaris. (David Carlier) diff --git a/ext/random/engine_mt19937.c b/ext/random/engine_mt19937.c index 609efae861b25..bc73513fe216c 100644 --- a/ext/random/engine_mt19937.c +++ b/ext/random/engine_mt19937.c @@ -302,7 +302,6 @@ PHP_METHOD(Random_Engine_Mt19937, generate) generated = engine->algo->generate(engine->status); size = engine->status->last_generated_size; if (EG(exception)) { - zend_throw_exception(spl_ce_RuntimeException, "Random number generation failed", 0); RETURN_THROWS(); } diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c index 2672477feccb8..7d6690cd7e01a 100644 --- a/ext/random/randomizer.c +++ b/ext/random/randomizer.c @@ -100,12 +100,11 @@ PHP_METHOD(Random_Randomizer, nextInt) ZEND_PARSE_PARAMETERS_NONE(); result = randomizer->algo->generate(randomizer->status); - if (randomizer->status->last_generated_size > sizeof(zend_long)) { - zend_throw_exception(spl_ce_RuntimeException, "Generated value exceeds size of int", 0); + if (EG(exception)) { RETURN_THROWS(); } - if (EG(exception)) { - zend_throw_exception(spl_ce_RuntimeException, "Random number generation failed", 0); + if (randomizer->status->last_generated_size > sizeof(zend_long)) { + zend_throw_exception(spl_ce_RuntimeException, "Generated value exceeds size of int", 0); RETURN_THROWS(); } @@ -132,7 +131,6 @@ PHP_METHOD(Random_Randomizer, getInt) result = randomizer->algo->range(randomizer->status, min, max); if (EG(exception)) { - zend_throw_exception(spl_ce_RuntimeException, "Random number generation failed", 0); RETURN_THROWS(); } @@ -165,7 +163,6 @@ PHP_METHOD(Random_Randomizer, getBytes) result = randomizer->algo->generate(randomizer->status); if (EG(exception)) { zend_string_free(retval); - zend_throw_exception(spl_ce_RuntimeException, "Random number generation failed", 0); RETURN_THROWS(); } for (size_t i = 0; i < randomizer->status->last_generated_size; i++) { @@ -193,7 +190,6 @@ PHP_METHOD(Random_Randomizer, shuffleArray) ZVAL_DUP(return_value, array); if (!php_array_data_shuffle(randomizer->algo, randomizer->status, return_value)) { - zend_throw_exception(spl_ce_RuntimeException, "Random number generation failed", 0); RETURN_THROWS(); } } @@ -215,7 +211,6 @@ PHP_METHOD(Random_Randomizer, shuffleBytes) RETVAL_STRINGL(ZSTR_VAL(bytes), ZSTR_LEN(bytes)); if (!php_binary_string_shuffle(randomizer->algo, randomizer->status, Z_STRVAL_P(return_value), (zend_long) Z_STRLEN_P(return_value))) { - zend_throw_exception(spl_ce_RuntimeException, "Random number generation failed", 0); RETURN_THROWS(); } } diff --git a/ext/random/tests/03_randomizer/user_throws.phpt b/ext/random/tests/03_randomizer/user_throws.phpt index c0708e0514419..41cd004b63879 100644 --- a/ext/random/tests/03_randomizer/user_throws.phpt +++ b/ext/random/tests/03_randomizer/user_throws.phpt @@ -21,9 +21,4 @@ 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 diff --git a/ext/random/tests/03_randomizer/user_unsafe.phpt b/ext/random/tests/03_randomizer/user_unsafe.phpt index 4497088ba9da1..e95a15840057d 100644 --- a/ext/random/tests/03_randomizer/user_unsafe.phpt +++ b/ext/random/tests/03_randomizer/user_unsafe.phpt @@ -15,7 +15,7 @@ final class EmptyStringEngine implements \Random\Engine { final class HeavilyBiasedEngine implements \Random\Engine { public function generate(): string { - return "\xff\xff\xff\xff\xff\xff\xff\xff"; + return \str_repeat("\xff", PHP_INT_SIZE); } } @@ -32,25 +32,33 @@ foreach ([ } catch (Throwable $e) { echo $e, PHP_EOL; } - + echo PHP_EOL, "-------", PHP_EOL, PHP_EOL; - + + try { + var_dump((new Randomizer(new $engine()))->nextInt()); + } catch (Throwable $e) { + echo $e, PHP_EOL; + } + + echo PHP_EOL, "-------", PHP_EOL, PHP_EOL; + try { var_dump(bin2hex((new Randomizer(new $engine()))->getBytes(1))); } catch (Throwable $e) { echo $e, PHP_EOL; } - + echo PHP_EOL, "-------", PHP_EOL, PHP_EOL; - + try { var_dump((new Randomizer(new $engine()))->shuffleArray(\range(1, 10))); } catch (Throwable $e) { echo $e, PHP_EOL; } - + echo PHP_EOL, "-------", PHP_EOL, PHP_EOL; - + try { var_dump((new Randomizer(new $engine()))->shuffleBytes('foobar')); } catch (Throwable $e) { @@ -71,19 +79,16 @@ Stack trace: #0 %s(%d): Random\Randomizer->getInt(0, 123) #1 {main} -Next RuntimeException: Random number generation failed in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->getInt(0, 123) -#1 {main} - ------- Error: A random engine must return a non-empty string in %s:%d Stack trace: -#0 %s(%d): Random\Randomizer->getBytes(1) +#0 %s(%d): Random\Randomizer->nextInt() #1 {main} -Next RuntimeException: Random number generation failed in %s:%d +------- + +Error: A random engine must return a non-empty string in %s:%d Stack trace: #0 %s(%d): Random\Randomizer->getBytes(1) #1 {main} @@ -95,11 +100,6 @@ Stack trace: #0 %s(%d): Random\Randomizer->shuffleArray(Array) #1 {main} -Next RuntimeException: Random number generation failed in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->shuffleArray(Array) -#1 {main} - ------- Error: A random engine must return a non-empty string in %s:%d @@ -107,11 +107,6 @@ Stack trace: #0 %s(%d): Random\Randomizer->shuffleBytes('foobar') #1 {main} -Next RuntimeException: Random number generation failed in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->shuffleBytes('foobar') -#1 {main} - ===================== HeavilyBiasedEngine ===================== @@ -121,10 +116,9 @@ Stack trace: #0 %s(%d): Random\Randomizer->getInt(0, 123) #1 {main} -Next RuntimeException: Random number generation failed in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->getInt(0, 123) -#1 {main} +------- + +int(%d) ------- @@ -137,11 +131,6 @@ Stack trace: #0 %s(%d): Random\Randomizer->shuffleArray(Array) #1 {main} -Next RuntimeException: Random number generation failed in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->shuffleArray(Array) -#1 {main} - ------- Error: Failed to generate an acceptable random number in 50 attempts in %s:%d @@ -149,9 +138,4 @@ Stack trace: #0 %s(%d): Random\Randomizer->shuffleBytes('foobar') #1 {main} -Next RuntimeException: Random number generation failed in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->shuffleBytes('foobar') -#1 {main} - =====================