mirror of
https://github.com/php/php-src.git
synced 2026-03-28 10:12:18 +01:00
Fix bug #77390 (feof might hang on TLS streams in case of fragmented TLS records)
Simplified version of the fix from Abyl Valg so credit to him.
This commit is contained in:
4
NEWS
4
NEWS
@@ -34,6 +34,10 @@ PHP NEWS
|
||||
. Fixed bug #77361 (configure fails on 64-bit AIX when opcache enabled).
|
||||
(Kevin Adler)
|
||||
|
||||
- OpenSSL:
|
||||
. Fixed bug #77390 (feof might hang on TLS streams in case of fragmented TLS
|
||||
records). (Abyl Valg, Jakub Zelenka)
|
||||
|
||||
- PDO:
|
||||
. Fixed bug #77273 (array_walk_recursive corrupts value types leading to PDO
|
||||
failure). (Nikita)
|
||||
|
||||
@@ -23,10 +23,16 @@ $clientCode = <<<'CODE'
|
||||
|
||||
$read = [$fp];
|
||||
$buf = '';
|
||||
$printed = false;
|
||||
while (stream_select($read, $write, $except, 1000)) {
|
||||
$chunk = stream_get_contents($fp, 4096);
|
||||
var_dump($chunk);
|
||||
$buf .= $chunk;
|
||||
if ($chunk !== "") {
|
||||
var_dump($chunk);
|
||||
$buf .= $chunk;
|
||||
} elseif (!$printed) {
|
||||
$printed = true;
|
||||
var_dump($chunk);
|
||||
}
|
||||
if ($buf === 'hello, world') {
|
||||
break;
|
||||
}
|
||||
@@ -110,5 +116,4 @@ ServerClientTestCase::getInstance()->run($clientCode, [
|
||||
?>
|
||||
--EXPECT--
|
||||
string(0) ""
|
||||
string(0) ""
|
||||
string(12) "hello, world"
|
||||
|
||||
@@ -2405,30 +2405,22 @@ static int php_openssl_sockop_set_option(php_stream *stream, int option, int val
|
||||
alive = 0;
|
||||
} else if (php_pollfd_for(sslsock->s.socket, PHP_POLLREADABLE|POLLPRI, &tv) > 0) {
|
||||
if (sslsock->ssl_active) {
|
||||
int n;
|
||||
|
||||
do {
|
||||
n = SSL_peek(sslsock->ssl_handle, &buf, sizeof(buf));
|
||||
if (n <= 0) {
|
||||
int err = SSL_get_error(sslsock->ssl_handle, n);
|
||||
|
||||
if (err == SSL_ERROR_SYSCALL) {
|
||||
int n = SSL_peek(sslsock->ssl_handle, &buf, sizeof(buf));
|
||||
if (n <= 0) {
|
||||
int err = SSL_get_error(sslsock->ssl_handle, n);
|
||||
switch (err) {
|
||||
case SSL_ERROR_SYSCALL:
|
||||
alive = php_socket_errno() == EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
|
||||
/* re-negotiate */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* any other problem is a fatal error */
|
||||
alive = 0;
|
||||
case SSL_ERROR_WANT_READ:
|
||||
case SSL_ERROR_WANT_WRITE:
|
||||
alive = 1;
|
||||
break;
|
||||
default:
|
||||
/* any other problem is a fatal error */
|
||||
alive = 0;
|
||||
}
|
||||
/* either peek succeeded or there was an error; we
|
||||
* have set the alive flag appropriately */
|
||||
break;
|
||||
} while (1);
|
||||
}
|
||||
} else if (0 == recv(sslsock->s.socket, &buf, sizeof(buf), MSG_PEEK) && php_socket_errno() != EAGAIN) {
|
||||
alive = 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user