Bug #53592 [Asn->Csd]: stream_socket_enable_crypto() uses NONBLOCK
| From: | cataphract@php.net | Date: | Thu, 23 Dec 2010 01:45:11 +0000 |
| Subject: | Bug #53592 [Asn->Csd]: stream_socket_enable_crypto() uses NONBLOCK | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-157278@lists.php.net to get a copy of this message | ||
Edit report at http://bugs.php.net/bug.php?id=53592&edit=1
ID: 53592
Updated by: cataphract@php.net
Reported by: jerry dot wilborn at paetec dot com
Summary: stream_socket_enable_crypto() uses NONBLOCK
-Status: Assigned
+Status: Closed
Type: Bug
Package: Sockets related
Operating System: CentOS 4.4
PHP Version: 5.3.4
Assigned To: cataphract
Block user comment: N
Private report: N
New Comment:
This bug has been fixed in SVN.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
Thank you for the report, and for helping us make PHP better.
Previous Comments:
------------------------------------------------------------------------
[2010-12-23 02:44:57] cataphract@php.net
Automatic comment from SVN on behalf of cataphract
Revision: http://svn.php.net/viewvc/?view=revision&revision=306581
Log: - Fixed bug #53592 (stream_socket_enable_crypto() busy-waits in
client mode).
- Fixed stream_socket_enable_crypto() not honoring the socket timeout in
server mode.
------------------------------------------------------------------------
[2010-12-22 17:47:42] cataphract@php.net
This bug was introduced when fixing bug #39571.
------------------------------------------------------------------------
[2010-12-22 16:43:53] cataphract@php.net
This doesn't seem a problem only where the handshake doesn't work.
Testing with a host with 10 ms latency, I count:
* More than 11k read() calls if enabling SSL succeeds (probably because
more messages are exchanged)
* Only 900 read() calls if enabling SSL doesn't succeed
------------------------------------------------------------------------
[2010-12-22 14:59:25] jerry dot wilborn at paetec dot com
Fix summary.
------------------------------------------------------------------------
[2010-12-22 04:06:38] jerry dot wilborn at paetec dot com
Description:
------------
stream_socket_enable_crypto() changes the stream to NONBLOCK before it
attempts
the encryption. I'm assuming this is so the timeout can be tracked, but
for
connections where the handshake doesn't work the process simply chews up
CPU while
the read() repeatedly EAGAIN fails and gettimeofday() is called.
Test script:
---------------
$stream = stream_socket_client("tcp://72.14.204.147:80", $errno,
$errstr, 5);
stream_socket_enable_crypto($stream, TRUE,
STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
Expected result:
----------------
For the socket to stay in blocked mode.
Actual result:
--------------
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
fcntl64(3, F_GETFL) = 0x2 (flags O_RDWR)
fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(80),
sin_addr=inet_addr("72.14.204.147")}, 16) = -1 EINPROGRESS (Operation
now in
progress)
poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP, revents=POLLOUT}],
1, 1000) =
1
getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
fcntl64(3, F_SETFL, O_RDWR) = 0
select(4, [3], [3], [], {5, 0}) = 1 (out [3], left {5, 0})
fcntl64(3, F_GETFL) = 0x2 (flags O_RDWR)
fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=53592&edit=1