]> granicus.if.org Git - php/commitdiff
Fix assertion failure in SoapFault ctor
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 5 Sep 2017 15:38:50 +0000 (17:38 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 5 Sep 2017 15:38:50 +0000 (17:38 +0200)
Resetting the IAP on a shared array violates COW. I'm replacing this
with code to look up indexes 0 and 1, even though this is not
strictly the same.

ext/soap/soap.c

index 32cc648a2824784b7c28b40019e0c7382836483a..3c7e84796453fcb6998e634538c9733c7f42ef34 100644 (file)
@@ -891,16 +891,12 @@ PHP_METHOD(SoapFault, SoapFault)
                fault_code = Z_STRVAL_P(code);
                fault_code_len = Z_STRLEN_P(code);
        } else if (Z_TYPE_P(code) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL_P(code)) == 2) {
-               zval *t_ns, *t_code;
-
-               zend_hash_internal_pointer_reset(Z_ARRVAL_P(code));
-               t_ns = zend_hash_get_current_data(Z_ARRVAL_P(code));
-               zend_hash_move_forward(Z_ARRVAL_P(code));
-               t_code = zend_hash_get_current_data(Z_ARRVAL_P(code));
-               if (Z_TYPE_P(t_ns) == IS_STRING && Z_TYPE_P(t_code) == IS_STRING) {
-                 fault_code_ns = Z_STRVAL_P(t_ns);
-                 fault_code = Z_STRVAL_P(t_code);
-                 fault_code_len = Z_STRLEN_P(t_code);
+               zval *t_ns = zend_hash_index_find(Z_ARRVAL_P(code), 0);
+               zval *t_code = zend_hash_index_find(Z_ARRVAL_P(code), 1);
+               if (t_ns && t_code && Z_TYPE_P(t_ns) == IS_STRING && Z_TYPE_P(t_code) == IS_STRING) {
+                       fault_code_ns = Z_STRVAL_P(t_ns);
+                       fault_code = Z_STRVAL_P(t_code);
+                       fault_code_len = Z_STRLEN_P(t_code);
                } else {
                        php_error_docref(NULL, E_WARNING, "Invalid fault code");
                        return;