@@ -184,9 +184,10 @@ typedef struct _php_openssl_alpn_ctx_t {
184184
185185/* Holds session callback */
186186typedef struct _php_openssl_session_callbacks_t {
187- zval new_cb ; // Callback for new sessions
188- zval get_cb ; // Callback to retrieve sessions (server only)
189- zval remove_cb ; // Callback when session removed (server only)
187+ int refcount ;
188+ zval new_cb ;
189+ zval get_cb ;
190+ zval remove_cb ;
190191} php_openssl_session_callbacks_t ;
191192
192193/* This implementation is very closely tied to the that of the native
@@ -1717,6 +1718,7 @@ static zend_result php_openssl_validate_and_allocate_callback(
17171718 ZVAL_UNDEF (& sslsock -> session_callbacks -> new_cb );
17181719 ZVAL_UNDEF (& sslsock -> session_callbacks -> get_cb );
17191720 ZVAL_UNDEF (& sslsock -> session_callbacks -> remove_cb );
1721+ sslsock -> session_callbacks -> refcount = 1 ;
17201722 }
17211723
17221724 return SUCCESS ;
@@ -2127,6 +2129,10 @@ static zend_result php_openssl_setup_crypto(php_stream *stream,
21272129 } else {
21282130 SSL_CTX_up_ref (parent_sslsock -> ctx );
21292131 sslsock -> ctx = parent_sslsock -> ctx ;
2132+ if (parent_sslsock -> session_callbacks ) {
2133+ parent_sslsock -> session_callbacks -> refcount ++ ;
2134+ sslsock -> session_callbacks = parent_sslsock -> session_callbacks ;
2135+ }
21302136
21312137 sslsock -> ssl_handle = SSL_new (sslsock -> ctx );
21322138 if (!sslsock -> ssl_handle ) {
@@ -2664,7 +2670,7 @@ static int php_openssl_sockop_close(php_stream *stream, int close_handle) /* {{{
26642670 pefree (sslsock -> reneg , php_stream_is_persistent (stream ));
26652671 }
26662672
2667- if (sslsock -> session_callbacks ) {
2673+ if (sslsock -> session_callbacks && -- sslsock -> session_callbacks -> refcount == 0 ) {
26682674 zval_ptr_dtor (& sslsock -> session_callbacks -> new_cb );
26692675 zval_ptr_dtor (& sslsock -> session_callbacks -> get_cb );
26702676 zval_ptr_dtor (& sslsock -> session_callbacks -> remove_cb );
0 commit comments