From ed46a955b0a98747e45df56f0080defdf51fbc68 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sun, 16 Jun 2024 19:45:27 +0100 Subject: [PATCH] ext/soap: Fix memory leaks when calling SoapFault::__construct() twice --- ext/soap/soap.c | 14 ++++++++++++++ ext/soap/tests/SoapFault/gh14586.phpt | 12 ++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 ext/soap/tests/SoapFault/gh14586.phpt diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 96f307a434b8e..eaea09b461d57 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -520,6 +520,17 @@ PHP_METHOD(SoapHeader, __construct) } /* }}} */ +static void soap_fault_dtor_properties(zval *obj) +{ + zval_ptr_dtor(Z_FAULT_STRING_P(obj)); + zval_ptr_dtor(Z_FAULT_CODE_P(obj)); + zval_ptr_dtor(Z_FAULT_CODENS_P(obj)); + zval_ptr_dtor(Z_FAULT_ACTOR_P(obj)); + zval_ptr_dtor(Z_FAULT_DETAIL_P(obj)); + zval_ptr_dtor(Z_FAULT_NAME_P(obj)); + zval_ptr_dtor(Z_FAULT_HEADERFAULT_P(obj)); +} + /* {{{ SoapFault constructor */ PHP_METHOD(SoapFault, __construct) { @@ -539,6 +550,9 @@ PHP_METHOD(SoapFault, __construct) Z_PARAM_ZVAL_OR_NULL(headerfault) ZEND_PARSE_PARAMETERS_END(); + /* Delete previously set properties */ + soap_fault_dtor_properties(ZEND_THIS); + if (code_str) { fault_code = ZSTR_VAL(code_str); fault_code_len = ZSTR_LEN(code_str); diff --git a/ext/soap/tests/SoapFault/gh14586.phpt b/ext/soap/tests/SoapFault/gh14586.phpt new file mode 100644 index 0000000000000..91a273da09d5d --- /dev/null +++ b/ext/soap/tests/SoapFault/gh14586.phpt @@ -0,0 +1,12 @@ +--TEST-- +GH-14586: SoapFault::__construct() leaks memory if called twice +--EXTENSIONS-- +soap +--FILE-- +__construct(null, "x"); +?> +DONE +--EXPECT-- +DONE