Edit report at http://bugs.php.net/bug.php?id=53592&edit=1

 ID:                 53592
 Updated by:         cataphr...@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] cataphr...@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] cataphr...@php.net

This bug was introduced when fixing bug #39571.

------------------------------------------------------------------------
[2010-12-22 16:43:53] cataphr...@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

Reply via email to