Unify ext/random unserialize errors with ext/date (#9185)

* Unify ext/random unserialize errors with ext/date

- Use `Error` instead of `Exception`.
- Adjust wording.

* Make `zend_read_property` silent in `Randomizer::__unserialize()`

Having:

> Error: Typed property Random\Randomizer::$engine must not be accessed before
> initialization

is not a value-add in this case.

* Insert the actual class name in the unserialization error of Engines

* Revert unserialization failure back to Exception from Error

see https://news-web.php.net/php.internals/118311
This commit is contained in:
Tim Düsterhus 2022-08-02 09:00:37 +02:00 committed by GitHub
parent 5d5d9796fc
commit c63f18dd9b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 14 deletions

View file

@ -357,7 +357,7 @@ PHP_METHOD(Random_Engine_Mt19937, __unserialize)
/* members */ /* members */
t = zend_hash_index_find(d, 0); t = zend_hash_index_find(d, 0);
if (!t || Z_TYPE_P(t) != IS_ARRAY) { if (!t || Z_TYPE_P(t) != IS_ARRAY) {
zend_throw_exception(NULL, "Incomplete or ill-formed serialization data", 0); zend_throw_exception_ex(NULL, 0, "Invalid serialization data for %s object", ZSTR_VAL(engine->std.ce->name));
RETURN_THROWS(); RETURN_THROWS();
} }
object_properties_load(&engine->std, Z_ARRVAL_P(t)); object_properties_load(&engine->std, Z_ARRVAL_P(t));
@ -365,11 +365,11 @@ PHP_METHOD(Random_Engine_Mt19937, __unserialize)
/* state */ /* state */
t = zend_hash_index_find(d, 1); t = zend_hash_index_find(d, 1);
if (!t || Z_TYPE_P(t) != IS_ARRAY) { if (!t || Z_TYPE_P(t) != IS_ARRAY) {
zend_throw_exception(NULL, "Incomplete or ill-formed serialization data", 0); zend_throw_exception_ex(NULL, 0, "Invalid serialization data for %s object", ZSTR_VAL(engine->std.ce->name));
RETURN_THROWS(); RETURN_THROWS();
} }
if (!engine->algo->unserialize(engine->status, Z_ARRVAL_P(t))) { if (!engine->algo->unserialize(engine->status, Z_ARRVAL_P(t))) {
zend_throw_exception(NULL, "Engine unserialize failed", 0); zend_throw_exception_ex(NULL, 0, "Invalid serialization data for %s object", ZSTR_VAL(engine->std.ce->name));
RETURN_THROWS(); RETURN_THROWS();
} }
} }

View file

@ -282,14 +282,14 @@ PHP_METHOD(Random_Randomizer, __unserialize)
members_zv = zend_hash_index_find(d, 0); members_zv = zend_hash_index_find(d, 0);
if (!members_zv || Z_TYPE_P(members_zv) != IS_ARRAY) { if (!members_zv || Z_TYPE_P(members_zv) != IS_ARRAY) {
zend_throw_exception(NULL, "Incomplete or ill-formed serialization data", 0); zend_throw_exception(NULL, "Invalid serialization data for Random\\Randomizer object", 0);
RETURN_THROWS(); RETURN_THROWS();
} }
object_properties_load(&randomizer->std, Z_ARRVAL_P(members_zv)); object_properties_load(&randomizer->std, Z_ARRVAL_P(members_zv));
zengine = zend_read_property(randomizer->std.ce, &randomizer->std, "engine", strlen("engine"), 0, NULL); zengine = zend_read_property(randomizer->std.ce, &randomizer->std, "engine", strlen("engine"), 1, NULL);
if (Z_TYPE_P(zengine) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(zengine), random_ce_Random_Engine)) { if (Z_TYPE_P(zengine) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(zengine), random_ce_Random_Engine)) {
zend_throw_exception(NULL, "Incomplete or ill-formed serialization data", 0); zend_throw_exception(NULL, "Invalid serialization data for Random\\Randomizer object", 0);
RETURN_THROWS(); RETURN_THROWS();
} }

View file

@ -65,13 +65,13 @@ try {
?> ?>
--EXPECT-- --EXPECT--
Random\Engine\Mt19937 Random\Engine\Mt19937
Engine unserialize failed Invalid serialization data for Random\Engine\Mt19937 object
Engine unserialize failed Invalid serialization data for Random\Engine\Mt19937 object
Engine unserialize failed Invalid serialization data for Random\Engine\Mt19937 object
Engine unserialize failed Invalid serialization data for Random\Engine\Mt19937 object
Random\Engine\PcgOneseq128XslRr64 Random\Engine\PcgOneseq128XslRr64
Engine unserialize failed Invalid serialization data for Random\Engine\PcgOneseq128XslRr64 object
Engine unserialize failed Invalid serialization data for Random\Engine\PcgOneseq128XslRr64 object
Random\Engine\Xoshiro256StarStar Random\Engine\Xoshiro256StarStar
Engine unserialize failed Invalid serialization data for Random\Engine\Xoshiro256StarStar object
Engine unserialize failed Invalid serialization data for Random\Engine\Xoshiro256StarStar object