php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
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
Status: Closed Package: Sockets related
PHP Version: 5.3.4 OS: CentOS 4.4
Private report: No CVE-ID:
 [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

Add a Patch

Pull Requests

Add a Pull Request

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-22 17:47 UTC] cataphract@php.net
This bug was introduced when fixing bug #39571.
 [2010-12-23 02:44 UTC] 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-23 02:45 UTC] cataphract@php.net
-Status: Assigned +Status: Closed
 [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.


 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Wed Apr 23 07:02:14 2014 UTC