new bug in 5.1.0b3 with length param in fread() with local files

php.internals

Greg Beaver

21 years ago
Hi, I have noticed that fread()'s behavior has changed between PHP 5.0.4 and PHP 5.1.0b3. Basically, http://pear.chiaraquartet.net/go-pear.phar works in PHP 5.0.4 and fails in 5.1.0b3 because of this change. The line in question of the .phar from PHP_Archive is: fread($this->_file, $this->internalFileLength + $this->footerLength); Basically, a .phar is a .tar. For files inside the .phar larger than 16000 bytes, the fread above fails with the incorrect error message: PHP Warning: fread(): Length parameter must be greater than 0 in c:\php5\pear\PHP\Archive.php on line 193 Note that the failure is OS-independent. However, the actual length parameter is 21,155, which is not less than zero, unless you consider it to be a negative number in binary. After the fread in PHP 5.0.4, ftell() reveals that the pointer has advanced to 22016, whereas in 5.1.0b3, it has only advanced to 16384. According to the notes in http://bugs.php.net/bug.php?id=30936 this should work with a local file, so should I re-open 30936, or is this a new bug? Greg

Wez Furlong

21 years ago
If you've spotted a behaviour change, open a new bug with a short self-contained reproducing script. I suspect some kind of engine bug here, because what you've described doesn't make sense :) That warning about the length comes from this code in the fread function: len = Z_LVAL_PP(arg2); if (len <= 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0"); RETURN_FALSE; } So either you are passing in something that evaluates as 0 (or less), or something is corrupting memory and breaking the length value by the time it reaches fread(). I'd recommend running your script under valgrind (--disable-memory-manager when you configure PHP) and see if it reports anything bad. --Wez. On 7/22/05, Greg Beaver <cellog@php.net> wrote:

Greg Beaver

21 years ago
Wez Furlong wrote:
> If you've spotted a behaviour change, open a new bug with a short > self-contained reproducing script. I suspect some kind of engine bug > here, because what you've described doesn't make sense :) > > That warning about the length comes from this code in the fread function: > > len = Z_LVAL_PP(arg2); > if (len <= 0) { > php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter > must be greater than 0"); > RETURN_FALSE; > } > > So either you are passing in something that evaluates as 0 (or less), > or something is corrupting memory and breaking the length value by the > time it reaches fread().
In the attempt to find a short reproducing test script, I determined that the warning was caused by an earlier iteration through the method that uses fread. So, the warning was valid (0 was being passed in). What this means, however, is that the script is in fact simply failing to read in the requested amount with no warning at all. I'll have a test script shortly for the bug report. Greg

Andi Gutmans

21 years ago
Has anyone had a chance to look at this problem? At 10:08 PM 7/21/2005 -0600, Greg Beaver wrote:

Wez Furlong

21 years ago
From the description, it doesn't sound like a bug. Awaiting more details. --Wez. On 7/25/05, Andi Gutmans <andi@zend.com> wrote: