#46917 [Opn->Csd]: Socket handling completely broken
| From: | felipe@php.net | Date: | Sat, 03 Jan 2009 17:00:02 +0000 |
| Subject: | #46917 [Opn->Csd]: Socket handling completely broken | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-132530@lists.php.net to get a copy of this message | ||
ID: 46917
Updated by: felipe@php.net
Reported By: jost_boekemeier at users dot sf dot net
-Status: Open
+Status: Closed
Bug Type: Streams related
Operating System: *
PHP Version: 5.2.8
New Comment:
This bug has been fixed in CVS.
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.
I added the Win part minutes ago:
-#ifndef PHP_WIN32
+/* Reseting/initializing */
+#ifdef PHP_WIN32
+ WSASetLastError(0);
+#else
errno = 0;
#endif
Ok, then, closed. Thanks.
Previous Comments:
------------------------------------------------------------------------
[2009-01-03 16:45:50] jost_boekemeier at users dot sf dot net
Yes, this patch fixes the problem on Linux.
What about Windows?
Regards,
Jost Boekemeier
------------------------------------------------------------------------
[2009-01-02 21:31:43] felipe@php.net
Hi, I've commited a probable fix, I initialized the errno.
http://news.php.net/php.cvs/55296
Can you test it with a cvs version again?
------------------------------------------------------------------------
[2008-12-26 17:28:10] jost_boekemeier at users dot sf dot net
Due to its nature (uninitialized variable) you may or may not be able
to reproduce this bug. See
http://sourceforge.net/mailarchive/forum.php?thread_name=828E3F73B78941EAB5AF3E2E07C37D8D%40IBM1020C944423&forum_name=php-java-bridge-users
for details.
However, you should immediately see the bug by looking at the PHP
source code:
0 == recv(sock->socket, &buf, sizeof(buf), MSG_PEEK
does NOT set errno (the result code is 0, not -1) so that errno
contains a bogus value, most likely the error code from a previously
failed sys call, so that
php_socket_errno() != EAGAIN
fails, depending on the application's PHP code, as errno sometimes
contains EAGAIN (from a previous poll()).
Just search the PHP sources for the 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;
}
and set the errno or the lastErrorCode (for windows) to zero before
calling this pattern.
After that persistent sockets, soap and a few other places will work
reliably.
There are a few caveats, however. First, if you pass the last error
number to application-level, you might have to restore the last errno
immediately after the recv call. Second, I don't know what the
php_socket_errno() != EAGAIN should do, anyway, as EAGAIN is only set
when the previous sys call failed (result code -1, not 0!). So I suggest
to ask the author to explain his/her code before fixing anything.
Regards,
Jost Bökemeier
------------------------------------------------------------------------
[2008-12-24 19:48:34] felipe@php.net
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.
------------------------------------------------------------------------
[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
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/46917
--
Edit this bug report at http://bugs.php.net/?id=46917&edit=1