]> granicus.if.org Git - php/commitdiff
Fix #77297: SodiumException segfaults on PHP 7.3
authorScott <scott@paragonie.com>
Fri, 14 Dec 2018 21:35:49 +0000 (22:35 +0100)
committerChristoph M. Becker <cmbecker69@gmx.de>
Sun, 16 Dec 2018 15:36:47 +0000 (16:36 +0100)
Instead of trying to clean the argument arrays from the backtrace, we
overwrite them with empty arrays.

NEWS
ext/sodium/libsodium.c
ext/sodium/tests/utils.phpt

diff --git a/NEWS b/NEWS
index ddfdb44d6c1a2cda7240c6e2cc4b35b256622664..3a10688d13287d028fa97b3c47097f4f465bc8ea 100644 (file)
--- 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)
 
index 6372115fb424441bed298c4ce4c064edd2e0e039..125c8b74b249f351d50844fd31865ffd8aa7f8da 100644 (file)
@@ -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();
        }
index 4f99f75671a604becd1a54be39247cf5e415a88a..5823ab0b7f4add679873eea1558dd380e419d32b 100644 (file)
@@ -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"