feof hangs (bug #25939)

php.internals

Christian Schneider

22 years ago
I tried to reopen bug #25939 <http://bugs.php.net/bug.php?id=25939> because I ran into the same problem as <topace at lightbox dot org> but it's not my bug report. Should I open a new bug? I agree with the last comment that feof should not hang. Sample script: $fd = fsockopen('www.php.net', 80); feof($fd); This hangs for PHP >= 4.3.5 and PHP 5 Regards, - Chris

Wez Furlong

22 years ago
I just fixed PHP 5, but can't see how 4.3 could hang (admittedly only looked briefly). I have to go out for a couple of hours; if you could track down where PHP is blocking in the 4.3 branch, I'd very much appreciate it. --Wez.

Christian Schneider

22 years ago
Wez Furlong wrote:
> I have to go out for a couple of hours; if you could track down where PHP is > blocking in the 4.3 branch, I'd very much appreciate it.
It hangs in main/network.c the change introduced from 1.83.2.20 to 1.83.2.21 in the select shown here if no data can be read (yet). This doesn't mean that we encountered an eof though. (Another small nitpick is that tv.tv_usec is not initialized if default_socket_timeout is used). main/network.c: @@ -1139,9 +1139,15 @@ int alive = 1; int fd = sock->socket; fd_set rfds; - struct timeval tv = {0, 0}; + struct timeval tv; char buf; + if (sock->timeout.tv_sec == -1) { + tv.tv_sec = FG(default_socket_timeout); + } else { + tv = sock->timeout; + } + /* logic: if the select call indicates that there is data to * be read, but a read returns 0 bytes of data, then the socket * has been closed. */ FD_ZERO(&rfds); FD_SET(fd, &rfds); if (select(fd+1, &rfds, NULL, NULL, &tv) > 0) {

Wez Furlong

22 years ago
That was already reverted 5 weeks ago in CVS: http://cvs.php.net/diff.php/php-src/main/network.c?r1=1.83.2.23&r2=1.83.2.24&t y=u --Wez.

Christian Schneider

22 years ago
Wez Furlong wrote:
> That was already reverted 5 weeks ago in CVS: > http://cvs.php.net/diff.php/php-src/main/network.c?r1=1.83.2.23&r2=1.83.2.24&t > y=u
Oops, I checked release versions instead of the CVS, my apologies. - Chris