ID: 46917 Updated by: fel...@php.net Reported By: jost_boekemeier at users dot sf dot net -Status: Open +Status: Feedback Bug Type: Streams related Operating System: * PHP Version: 5.2.8 New Comment:
Thank you for this bug report. To properly diagnose the problem, we need a short but complete example script to be able to reproduce this bug ourselves. A proper reproducing script starts with <?php and ends with ?>, is max. 10-20 lines long and does not require any external resources such as databases, etc. If the script requires a database to demonstrate the issue, please make sure it creates all necessary tables, stored procedures etc. Please avoid embedding huge scripts into the report. Previous Comments: ------------------------------------------------------------------------ [2008-12-21 16:07:15] jost_boekemeier at users dot sf dot net 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 ------------------------------------------------------------------------ [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