[php-src] Issue #10495: feof hangs indefinitely
| From: | bytestream | Date: | Fri, 03 Feb 2023 17:34:04 +0000 |
| Subject: | [php-src] Issue #10495: feof hangs indefinitely | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-243634@lists.php.net to get a copy of this message | ||
Issue: https://github.com/php/php-src/issues/10495
Author: bytestream
### Description
I am using horde/imap-client to connect to an IMAPS server. If I disconnect the local network
interface after a couple of iterations of https://github.com/bytestream/Imap_Client/blob/ac98de92168777fb8bf0bacf3129fc178523defe/lib/Horde/Imap/Client/Socket/Connection/Socket.php#L186
when it's downloading a 30MB email body then
feof hangs indefintely.
stream_set_timeout(30); and default_socket_timeout of 60 seem
to have no effect...
The following is an example to illustrate the problem, and should not be used as a test case:
```php
<?php
$_stream = @stream_socket_client(
"ssl://server.com:993",
$error_number,
$error_string,
30,
STREAM_CLIENT_CONNECT,
stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'cafile' => '/etc/ssl/certs/ca-certificates.crt',
'allow_self_signed' => true,
],
])
);
stream_set_timeout($_stream, 30);
stream_set_read_buffer($_stream, 0);
stream_set_write_buffer($_stream, 0);
while (!feof($_stream)) {
$in = fread($_stream, 8192);
}
```
If I dump stream metadata, the result never changes:
```
array(8) {
["crypto"]=>
array(4) {
["protocol"]=>
string(7) "TLSv1.2"
["cipher_name"]=>
string(27) "ECDHE-RSA-AES128-GCM-SHA256"
["cipher_bits"]=>
int(128)
["cipher_version"]=>
string(7) "TLSv1.2"
}
["timed_out"]=>
bool(false)
["blocked"]=>
bool(true)
["eof"]=>
bool(false)
["stream_type"]=>
string(14) "tcp_socket/ssl"
["mode"]=>
string(2) "r+"
["unread_bytes"]=>
int(0)
["seekable"]=>
bool(false)
}
```
When using slightly modified code of:
```
while ($literal_len > 0) {
sleep(3);
if (! is_resource($this->_stream) || feof($this->_stream)) {
```
strace at the point where the process hangs shows:
```
16:57:11.921521 clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=3, tv_nsec=0}, 0x7fffb50a22b0) = 0
16:57:14.930968 poll([{fd=11, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 1 ([{fd=11,
revents=POLLIN}])
16:57:14.931033 read(11, "\27\3\3\20\30", 5) = 5
| 00000 17 03 03 10 18 ..... |
16:57:14.931068 read(11, "\26c\306", 4120) = 3
| 00000 16 63 c6 .c. |
16:57:14.931094 read(11,
```
File descriptor 11 is the socket to the IMAPS server.
### PHP Version
PHP 8.1.11
### Operating System
_No response_