2020#include "config.h"
2121#endif
2222#include "php_soap.h"
23- #if defined(HAVE_PHP_SESSION ) && !defined(COMPILE_DL_SESSION )
2423#include "ext/session/php_session.h"
25- #endif
2624#include "soap_arginfo.h"
2725#include "zend_exceptions.h"
2826#include "zend_interfaces.h"
2927#include "ext/standard/php_incomplete_class.h"
3028
29+ /* We only have session support if PHP was configured with session support
30+ * or if the session module could be loaded dynamically, which will only
31+ * work if soap is loaded dynamically as well. */
32+ #if defined(HAVE_PHP_SESSION ) || defined(COMPILE_DL_SOAP )
33+ # define SOAP_HAS_SESSION_SUPPORT
34+ #endif
35+
3136typedef struct _soapHeader {
3237 sdlFunctionPtr function ;
3338 zval function_name ;
@@ -298,6 +303,7 @@ PHP_MINFO_FUNCTION(soap);
298303static const zend_module_dep soap_deps [] = {
299304 ZEND_MOD_REQUIRED ("date" )
300305 ZEND_MOD_REQUIRED ("libxml" )
306+ ZEND_MOD_OPTIONAL ("session" )
301307 ZEND_MOD_END
302308};
303309
@@ -995,6 +1001,12 @@ PHP_METHOD(SoapServer, setPersistence)
9951001 if (service -> type == SOAP_CLASS ) {
9961002 if (value == SOAP_PERSISTENCE_SESSION ||
9971003 value == SOAP_PERSISTENCE_REQUEST ) {
1004+ if (value == SOAP_PERSISTENCE_SESSION && !zend_hash_str_exists (& module_registry , "session" , sizeof ("session" )- 1 )) {
1005+ SOAP_SERVER_END_CODE ();
1006+ zend_throw_error (NULL , "SoapServer::setPersistence(): Session persistence cannot be enabled because the session module is not enabled" );
1007+ RETURN_THROWS ();
1008+ }
1009+
9981010 service -> soap_class .persistence = value ;
9991011 } else {
10001012 zend_argument_value_error (
@@ -1406,22 +1418,18 @@ PHP_METHOD(SoapServer, handle)
14061418 soap_obj = & service -> soap_object ;
14071419 function_table = & ((Z_OBJCE_P (soap_obj ))-> function_table );
14081420 } else if (service -> type == SOAP_CLASS ) {
1409- #if defined( HAVE_PHP_SESSION ) && !defined( COMPILE_DL_SESSION )
1410- /* If persistent then set soap_obj from from the previous created session (if available) */
1421+ /* If persistent then set soap_obj from the previous created session (if available) */
1422+ #ifdef SOAP_HAS_SESSION_SUPPORT
14111423 if (service -> soap_class .persistence == SOAP_PERSISTENCE_SESSION ) {
1412- zval * session_vars , * tmp_soap_p ;
1413-
1414- if (PS (session_status ) != php_session_active &&
1415- PS (session_status ) != php_session_disabled ) {
1424+ php_session_status session_status = php_get_session_status ();
1425+ if (session_status != php_session_active &&
1426+ session_status != php_session_disabled ) {
14161427 php_session_start ();
14171428 }
14181429
14191430 /* Find the soap object and assign */
1420- session_vars = & PS (http_session_vars );
1421- ZVAL_DEREF (session_vars );
1422- if (Z_TYPE_P (session_vars ) == IS_ARRAY &&
1423- (tmp_soap_p = zend_hash_str_find (Z_ARRVAL_P (session_vars ), "_bogus_session_name" , sizeof ("_bogus_session_name" )- 1 )) != NULL &&
1424- Z_TYPE_P (tmp_soap_p ) == IS_OBJECT ) {
1431+ zval * tmp_soap_p = php_get_session_var_str ("_bogus_session_name" , sizeof ("_bogus_session_name" )- 1 );
1432+ if (tmp_soap_p != NULL && Z_TYPE_P (tmp_soap_p ) == IS_OBJECT ) {
14251433 if (EXPECTED (Z_OBJCE_P (tmp_soap_p ) == service -> soap_class .ce )) {
14261434 soap_obj = tmp_soap_p ;
14271435 } else if (Z_OBJCE_P (tmp_soap_p ) == php_ce_incomplete_class ) {
@@ -1431,9 +1439,9 @@ PHP_METHOD(SoapServer, handle)
14311439 }
14321440 }
14331441#endif
1442+
14341443 /* If new session or something weird happned */
14351444 if (soap_obj == NULL ) {
1436-
14371445 object_init_ex (& tmp_soap , service -> soap_class .ce );
14381446
14391447 /* Call constructor */
@@ -1448,25 +1456,23 @@ PHP_METHOD(SoapServer, handle)
14481456 goto fail ;
14491457 }
14501458 }
1451- #if defined( HAVE_PHP_SESSION ) && !defined( COMPILE_DL_SESSION )
1459+
14521460 /* If session then update session hash with new object */
1461+ #ifdef SOAP_HAS_SESSION_SUPPORT
14531462 if (service -> soap_class .persistence == SOAP_PERSISTENCE_SESSION ) {
1454- zval * session_vars = & PS (http_session_vars ), * tmp_soap_p ;
1455-
1456- ZVAL_DEREF (session_vars );
1457- if (Z_TYPE_P (session_vars ) == IS_ARRAY &&
1458- (tmp_soap_p = zend_hash_str_update (Z_ARRVAL_P (session_vars ), "_bogus_session_name" , sizeof ("_bogus_session_name" )- 1 , & tmp_soap )) != NULL ) {
1463+ zend_string * session_var_name = ZSTR_INIT_LITERAL ("_bogus_session_name" , false);
1464+ zval * tmp_soap_p = php_set_session_var (session_var_name , & tmp_soap , NULL );
1465+ if (tmp_soap_p != NULL ) {
14591466 soap_obj = tmp_soap_p ;
14601467 } else {
14611468 soap_obj = & tmp_soap ;
14621469 }
1463- } else {
1470+ zend_string_release_ex (session_var_name , false);
1471+ } else
1472+ #endif
1473+ {
14641474 soap_obj = & tmp_soap ;
14651475 }
1466- #else
1467- soap_obj = & tmp_soap ;
1468- #endif
1469-
14701476 }
14711477 function_table = & ((Z_OBJCE_P (soap_obj ))-> function_table );
14721478 } else {
@@ -1534,15 +1540,10 @@ PHP_METHOD(SoapServer, handle)
15341540 if (service -> type == SOAP_CLASS || service -> type == SOAP_OBJECT ) {
15351541 call_status = call_user_function (NULL , soap_obj , & function_name , & retval , num_params , params );
15361542 if (service -> type == SOAP_CLASS ) {
1537- #if defined(HAVE_PHP_SESSION ) && !defined(COMPILE_DL_SESSION )
15381543 if (service -> soap_class .persistence != SOAP_PERSISTENCE_SESSION ) {
15391544 zval_ptr_dtor (soap_obj );
15401545 soap_obj = NULL ;
15411546 }
1542- #else
1543- zval_ptr_dtor (soap_obj );
1544- soap_obj = NULL ;
1545- #endif
15461547 }
15471548 } else {
15481549 call_status = call_user_function (EG (function_table ), NULL , & function_name , & retval , num_params , params );
@@ -1557,11 +1558,7 @@ PHP_METHOD(SoapServer, handle)
15571558 php_output_discard ();
15581559 _soap_server_exception (service , function , ZEND_THIS );
15591560 if (service -> type == SOAP_CLASS ) {
1560- #if defined(HAVE_PHP_SESSION ) && !defined(COMPILE_DL_SESSION )
15611561 if (soap_obj && service -> soap_class .persistence != SOAP_PERSISTENCE_SESSION ) {
1562- #else
1563- if (soap_obj ) {
1564- #endif
15651562 zval_ptr_dtor (soap_obj );
15661563 }
15671564 }
@@ -1597,11 +1594,7 @@ PHP_METHOD(SoapServer, handle)
15971594 php_output_discard ();
15981595 _soap_server_exception (service , function , ZEND_THIS );
15991596 if (service -> type == SOAP_CLASS ) {
1600- #if defined(HAVE_PHP_SESSION ) && !defined(COMPILE_DL_SESSION )
16011597 if (soap_obj && service -> soap_class .persistence != SOAP_PERSISTENCE_SESSION ) {
1602- #else
1603- if (soap_obj ) {
1604- #endif
16051598 zval_ptr_dtor (soap_obj );
16061599 }
16071600 }
0 commit comments