]> granicus.if.org Git - php/commitdiff
Fixed support for SOAP_PERSISTENCE_SESSION
authorDmitry Stogov <dmitry@zend.com>
Thu, 15 May 2014 19:54:36 +0000 (23:54 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 15 May 2014 19:54:36 +0000 (23:54 +0400)
ext/soap/soap.c

index 0545bddf10ed7d879c87a4271c013f3a97d100ed..36c6ec5c50ba774a810bc406f9177b551eed2c0a 100644 (file)
@@ -1657,6 +1657,7 @@ PHP_METHOD(SoapServer, handle)
                /* If persistent then set soap_obj from from the previous created session (if available) */
                if (service->soap_class.persistance == SOAP_PERSISTENCE_SESSION) {
                        zval *tmp_soap;
+                       zval *session_vars;
 
                        if (PS(session_status) != php_session_active &&
                            PS(session_status) != php_session_disabled) {
@@ -1664,7 +1665,10 @@ PHP_METHOD(SoapServer, handle)
                        }
 
                        /* Find the soap object and assign */
-                       if ((tmp_soap = zend_hash_str_find(Z_ARRVAL(PS(http_session_vars)), "_bogus_session_name", sizeof("_bogus_session_name")-1)) != NULL &&
+                       session_vars = &PS(http_session_vars);
+                       ZVAL_DEREF(session_vars);
+                       if (Z_TYPE_P(session_vars) == IS_ARRAY &&
+                           (tmp_soap = zend_hash_str_find(Z_ARRVAL_P(session_vars), "_bogus_session_name", sizeof("_bogus_session_name")-1)) != NULL &&
                            Z_TYPE_P(tmp_soap) == IS_OBJECT &&
                            Z_OBJCE_P(tmp_soap) == service->soap_class.ce) {
                                soap_obj = tmp_soap;
@@ -1737,8 +1741,14 @@ PHP_METHOD(SoapServer, handle)
                        /* If session then update session hash with new object */
                        if (service->soap_class.persistance == SOAP_PERSISTENCE_SESSION) {
                                zval *tmp_soap_pp;
-                               if ((tmp_soap_pp = zend_hash_str_update(Z_ARRVAL(PS(http_session_vars)), "_bogus_session_name", sizeof("_bogus_session_name")-1, &tmp_soap)) != NULL) {
+                               zval *session_vars = &PS(http_session_vars);
+
+                               ZVAL_DEREF(session_vars);
+                               if (Z_TYPE_P(session_vars) == IS_ARRAY &&
+                                   (tmp_soap_pp = zend_hash_str_update(Z_ARRVAL_P(session_vars), "_bogus_session_name", sizeof("_bogus_session_name")-1, &tmp_soap)) != NULL) {
                                        soap_obj = tmp_soap_pp;
+                               } else {
+                                       soap_obj = &tmp_soap;
                                }
                        } else {
                                soap_obj = &tmp_soap;