#32858 [Asn->Fbk]: Bug #25649 has crept back into PHP - Improper feof() handling under FreeBSD
| From: | tony2001@php.net | Date: | Mon, 27 Jun 2005 18:52:23 +0000 |
| Subject: | #32858 [Asn->Fbk]: Bug #25649 has crept back into PHP - Improper feof() handling under FreeBSD | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-81088@lists.php.net to get a copy of this message | ||
ID: 32858
Updated by: tony2001@php.net
Reported By: lew at mailduct dot com
-Status: Assigned
+Status: Feedback
Bug Type: Filesystem function related
Operating System: FreeBSD 4.11-REL
PHP Version: 5.0.4, 4.3.10
Assigned To: wez
New Comment:
Please try using this CVS snapshot:
http://snaps.php.net/php5-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5-win32-latest.zip
Previous Comments:
------------------------------------------------------------------------
[2005-05-27 08:40:27] sniper@php.net
Assigning to Wez since he fixed it last time..
------------------------------------------------------------------------
[2005-05-27 00:02:11] lew at mailduct dot com
I have now tested this using PHP 5.0.4 (cli), and the bug remains.
This bug was fixed by wez@php.net on Sep 2003, but has now crept back
in to both versions 4 and 5 of PHP.
PHP is failing to clear the EOF indicator when reading a stream that
would otherwise BLOCK if read.
--- quote (wez@php.net):
The PHP streams implementation uses the following logic
for determining the EOF status:
- after a read attempt, if no bytes were read OR
(a read error occurred and the error != EWOULDBLOCK)
--> set the EOF indicator
otherwise, clear the EOF indicator [1]
- after a successful fseek(), clear the EOF indicator.
[1] - this step was missing and has just been comitted to
the CVS.
The feof() function call works like this:
- if stream buffer has data, return false
- otherwise, return the EOF indicator flag.
---endquote
------------------------------------------------------------------------
[2005-04-27 21:36:47] lew at mailduct dot com
Description:
------------
In my prior bug report #25649 from September 2003, I pointed out a
serious bug in how PHP handles FEOF under FreeBSD. It was fixed by
wez@php.net and committed.
This same problem (improper handling of feof() by PHP under FreeBSD)
has now crept into current 4.3.X versions of PHP...
Problem: Once set, the FEOF indicator is not properly cleared when
more data is appended to a file that is opened for read by a PHP
application.
Example: Suppose I want to "tail" a file using PHP. Once I hit the
EOF, I will no longer be able to read data from that file even when
another application appends to it. This is not the correct behaviour
for feof(), as illustrated by the prior fix done by wez@php.net.
Reproduce code:
---------------
--- program:
$fp = fopen( '/var/log/maillog','r' );
while( TRUE ) {
$r = array( $fp );
$n = stream_select( $r,$w=NULL,$e=NULL,30 );
if( $n ) {
echo fgets( $fp );
}
}
--- feeder:
echo "This is a test..." >> /var/log/maillog
Expected result:
----------------
For as long as PROGRAM is running, each time I run
FEEDER I expect to see PROGRAM output "This is a test..."
but it does not, because once EOF is reached, it is not
properly reset upon more data being appended to the file.
See pr #25649 for historical info...
Actual result:
--------------
PROGRAM will read the contents of /var/log/maillog until it
reaches EOF, and will not output anything else, even if new
data is appeneded to the file.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=32858&edit=1