From: Scott <scott@paragonie.com>
Date: Fri, 14 Dec 2018 21:35:49 +0000 (+0100)
Subject: Fix #77297: SodiumException segfaults on PHP 7.3
X-Git-Tag: php-7.3.1RC1~1
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e0e08d376ed14c6a94e2712659828a60aa71b70a;p=php

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.
---

diff --git a/NEWS b/NEWS
index ddfdb44d6c..3a10688d13 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 6372115fb4..125c8b74b2 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 4f99f75671..5823ab0b7f 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"