Skip to content

Commit ccf427f

Browse files
committed
Fix GH-19245: Success error message on TLS stream accept failure
This overwrites the previous message from the successful accept call. Closes GH-19246
1 parent f94c11f commit ccf427f

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

ext/openssl/tests/gh19245.phpt

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
--TEST--
2+
GH-19245: Success error message on TLS stream accept failure
3+
--EXTENSIONS--
4+
openssl
5+
--SKIPIF--
6+
<?php
7+
if (!function_exists("proc_open")) die("skip no proc_open");
8+
?>
9+
--FILE--
10+
<?php
11+
include 'ServerClientTestCase.inc';
12+
13+
$baseDir = __DIR__ . '/gh19245';
14+
$baseDirCertFile = $baseDir . '/cert.crt';
15+
$baseDirPkFile = $baseDir . '/private.key';
16+
17+
$serverCodeTemplate = <<<'CODE'
18+
ini_set('log_errors', 'On');
19+
ini_set('open_basedir', __DIR__ . '/gh19245');
20+
$serverUri = "ssl://127.0.0.1:0";
21+
$serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
22+
$serverCtx = stream_context_create(['ssl' => [
23+
'local_cert' => '%s',
24+
'local_pk' => '%s',
25+
]]);
26+
27+
$sock = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
28+
phpt_notify_server_start($sock);
29+
30+
$link = stream_socket_accept($sock);
31+
CODE;
32+
33+
$clientCode = <<<'CODE'
34+
$serverUri = "ssl://{{ ADDR }}";
35+
$clientFlags = STREAM_CLIENT_CONNECT;
36+
37+
$clientCtx = stream_context_create(['ssl' => [
38+
'verify_peer' => false,
39+
'verify_peer_name' => false
40+
]]);
41+
42+
@stream_socket_client($serverUri, $errno, $errstr, 2, $clientFlags, $clientCtx);
43+
CODE;
44+
45+
$serverCode = sprintf($serverCodeTemplate, $baseDirCertFile . "\0test", $baseDirPkFile);
46+
ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
47+
48+
?>
49+
--EXPECTF--
50+
PHP Warning: stream_socket_accept(): Path for local_cert in ssl stream context option must not contain any null bytes in %s
51+
PHP Warning: stream_socket_accept(): Unable to get real path of certificate file `%scert.crt' in %s
52+
PHP Warning: stream_socket_accept(): Failed to enable crypto in %s
53+
PHP Warning: stream_socket_accept(): Accept failed: Cannot enable crypto in %s

ext/openssl/xp_ssl.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2398,6 +2398,12 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_
23982398
php_stream_close(xparam->outputs.client);
23992399
xparam->outputs.client = NULL;
24002400
xparam->outputs.returncode = -1;
2401+
if (xparam->want_errortext) {
2402+
if (xparam->outputs.error_text) {
2403+
zend_string_free(xparam->outputs.error_text);
2404+
}
2405+
xparam->outputs.error_text = ZSTR_INIT_LITERAL("Cannot enable crypto", 0);
2406+
}
24012407
}
24022408
}
24032409
}

0 commit comments

Comments
 (0)