From e0e08d376ed14c6a94e2712659828a60aa71b70a Mon Sep 17 00:00:00 2001 From: Scott Date: Fri, 14 Dec 2018 22:35:49 +0100 Subject: [PATCH] Fix #77297: SodiumException segfaults on PHP 7.3 Instead of trying to clean the argument arrays from the backtrace, we overwrite them with empty arrays. --- NEWS | 3 +++ ext/sodium/libsodium.c | 5 ++--- ext/sodium/tests/utils.phpt | 12 ++++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index ddfdb44d6c1..3a10688d132 100644 --- a/NEWS +++ b/NEWS @@ -54,6 +54,9 @@ PHP NEWS . Fixed bug #77136 (Unsupported IPV6_RECVPKTINFO constants on macOS). (Mizunashi Mana) +- Sodium: + . Fixed bug #77297 (SodiumException segfaults on PHP 7.3). (Nikita, Scott) + - SQLite3: . Fixed bug #77051 (Issue with re-binding on SQLite3). (BohwaZ) diff --git a/ext/sodium/libsodium.c b/ext/sodium/libsodium.c index 6372115fb42..125c8b74b24 100644 --- a/ext/sodium/libsodium.c +++ b/ext/sodium/libsodium.c @@ -387,9 +387,8 @@ static void sodium_remove_param_values_from_backtrace(zend_object *obj) { ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(trace), frame) { if (Z_TYPE_P(frame) == IS_ARRAY) { zval *args = zend_hash_str_find(Z_ARRVAL_P(frame), "args", sizeof("args")-1); - if (args && Z_TYPE_P(frame) == IS_ARRAY) { - zend_hash_clean(Z_ARRVAL_P(args)); - } + zval_ptr_dtor(args); + ZVAL_EMPTY_ARRAY(args); } } ZEND_HASH_FOREACH_END(); } diff --git a/ext/sodium/tests/utils.phpt b/ext/sodium/tests/utils.phpt index 4f99f75671a..5823ab0b7f4 100644 --- a/ext/sodium/tests/utils.phpt +++ b/ext/sodium/tests/utils.phpt @@ -93,6 +93,17 @@ if (defined('SODIUM_BASE64_VARIANT_ORIGINAL')) { var_dump('base64("O") case passed'); var_dump('abcd'); } + +function sodium_foo() +{ + throw new SodiumException('test'); +} + +try { + sodium_foo(); +} catch (SodiumException $ex) { + var_dump($ex->getMessage()); +} ?> --EXPECT-- @@ -114,3 +125,4 @@ string(25) "base64("O1R") case passed" string(24) "base64("O1") case passed" string(23) "base64("O") case passed" string(4) "abcd" +string(4) "test"