- Notifications
You must be signed in to change notification settings - Fork8k
Closed
Description
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 ofhttps://github.com/bytestream/Imap_Client/blob/ac98de92168777fb8bf0bacf3129fc178523defe/lib/Horde/Imap/Client/Socket/Connection/Socket.php#L186 when it's downloading a 30MB email body thenfeof
hangs indefintely.stream_set_timeout(30);
anddefault_socket_timeout
of60
seem to have no effect...
The following is an example to illustrate the problem, and should not be used as a test case:
<?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) = 016: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