ID:               46917
 User updated by:  jost_boekemeier at users dot sf dot net
 Reported By:      jost_boekemeier at users dot sf dot net
 Status:           Open
 Bug Type:         *General Issues
 Operating System: Any
 PHP Version:      5.2.8
 New Comment:

The relevant part of the bug trace was missing. 

poll([{fd=16, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 1
([{fd=16, revents=POLLIN}])
recv(16, ""..., 1, MSG_PEEK)            = 0
send(16, "PUT /JavaBridge/JavaBridge.phpjavabridge HTTP/1.1\r\nHost:
localhost\r\nContent-Length: 40\r\nX_JAVABRIDGE_CHANNEL:
/dev/shm/.php_java_bridgexN2WsO\r\n\r\n\177C<H p=\"1\"
v=\"php.java.bridge.Util\"></H>"..., 185, 0) = 185
poll([{fd=16, events=POLLIN|POLLERR|POLLHUP}], 1, -1) = 1 ([{fd=16,
revents=POLLIN|POLLERR|POLLHUP}])
recv(16, ""..., 8192, 0)                = 0


Previous Comments:
------------------------------------------------------------------------

[2008-12-21 16:03:05] jost_boekemeier at users dot sf dot net

Description:
------------
PHP cannot handle broken socket connections due to an uninitialized
variable.

xp_socket.c and several other places contain the following pattern:

...
} else if (php_pollfd_for(sock->socket, PHP_POLLREADABLE|POLLPRI, &tv)
> 0) {
 if (0 == recv(sock->socket, &buf, sizeof(buf), MSG_PEEK) &&
php_socket_errno() != EAGAIN) {
        alive = 0;
}
...

It is obvious that the above code cannot work on any operating system;
checking if the socket doesn't have an error and then asking for its
error code is simply nonsense.

The same pattern is used in several other places within PHP.


The above code fails constantly on Windows. On Linux/Unix a workaround
is to add the constant 1E512 to the PHP script, which initializes errno
with a value != EAGAIN.


Regards,
Jost Bökemeier




Reproduce code:
---------------
pfsockopen() 
...
// restart back end
...
pfsockopen()

=>



Expected result:
----------------
...

poll([{fd=16, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 1
([{fd=16, revents=POLLIN}])
recv(16, ""..., 1, MSG_PEEK)            = 0
close(16)    

...

Actual result:
--------------
...

poll([{fd=16, events=POLLIN|POLLERR|POLLHUP}], 1, -1) = 1 ([{fd=16,
revents=POLLIN|POLLERR|POLLHUP}])
recv(16, ""..., 8192, 0)                = 0
gettimeofday({1229844164, 46391}, NULL) = 0
write(2, "[Sun Dec 21 08:22:44 2008] [error] [client 127.0.0.1] PHP
Notice:  Undefined index:  content_length in 

...


------------------------------------------------------------------------


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

Reply via email to