Skip to content

Commit 03b27dd

Browse files
committed
Fix external TLS session cache
1 parent a9359a5 commit 03b27dd

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

ext/openssl/tests/session_resumption_get_cb_no_ticket.phpt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,19 @@ $serverCode = <<<'CODE'
2626
}
2727
]]);
2828
29-
$server = @stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
30-
phpt_notify_server_start($server);
29+
try {
30+
$server = @stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $flags, $ctx);
31+
phpt_notify_server_start($server);
3132
32-
$client = @stream_socket_accept($server, 30);
33-
if ($client === false) {
34-
phpt_notify(message: "SERVER_FAILED_AS_EXPECTED");
35-
} else {
36-
phpt_notify(message: "SERVER_CREATED_UNEXPECTEDLY");
37-
fclose($server);
33+
$client = @stream_socket_accept($server, 30);
34+
if ($client === false) {
35+
phpt_notify(message: "SERVER_FAILED_UNEXPECTEDLY");
36+
} else {
37+
phpt_notify(message: "SERVER_CREATED_UNEXPECTEDLY");
38+
fclose($server);
39+
}
40+
} catch (\Throwable $e) {
41+
phpt_notify(message: "SERVER_EXCEPTION: " . $e->getMessage());
3842
}
3943
CODE;
4044
$serverCode = sprintf($serverCode, $certFile);
@@ -71,5 +75,5 @@ ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
7175
@unlink(__DIR__ . DIRECTORY_SEPARATOR . 'session_no_ticket.pem.tmp');
7276
?>
7377
--EXPECT--
74-
Connection failed as expected
75-
SERVER_FAILED_AS_EXPECTED
78+
SERVER_EXCEPTION: Session tickets cannot be enabled when session_get_cb is setConnection failed as expected
79+

ext/openssl/xp_ssl.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,10 @@ typedef struct _php_openssl_alpn_ctx_t {
184184

185185
/* Holds session callback */
186186
typedef 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

Comments
 (0)