PHP :: Bug #53592 :: stream_socket_enable_crypto() uses NONBLOCK

Bug #53592 stream_socket_enable_crypto() uses NONBLOCK
Submitted: 2010-12-22 04:06 UTC Modified: 2010-12-23 02:45 UTC
From: jerry dot wilborn at paetec dot com Assigned: cataphract (profile)
Status: Closed Package: Sockets related
PHP Version: 5.3.4 OS: CentOS 4.4
Private report: No CVE-ID: None

 [2010-12-22 04:06 UTC] 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


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports

 [2010-12-22 14:59 UTC] jerry dot wilborn at paetec dot com

-Summary: stream_socket_client uses NONBLOCK +Summary: stream_socket_enable_crypto() uses NONBLOCK

 [2010-12-22 14:59 UTC] jerry dot wilborn at paetec dot com

Fix summary.

 [2010-12-22 16:21 UTC] cataphract@php.net

-Status: Open +Status: Assigned -Assigned To: +Assigned To: cataphract

 [2010-12-22 16:43 UTC] 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-23 02:45 UTC] cataphract@php.net

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.