php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #9373 Filesystem read not binary safe?
Submitted: 2001-02-21 09:05 UTC Modified: 2001-02-22 06:53 UTC
From: auke at muze dot nl Assigned:
Status: Closed Package: Filesystem function related
PHP Version: 4.0.4pl1 OS: Windows NT
Private report: No CVE-ID: None
 [2001-02-21 09:05 UTC] auke at muze dot nl
Running PHP 4.0.4pl1 as an apache module (php4apache.dll)

When reading and writing files using any function except include() and require() the reading and writing seems to stop whenever a char(0) is encountered... I'm not exactly sure that is what happens, but textfiles are read and written without problems, binary files are cut short.

e.g.:

<?php
  readfile("someimage.gif");
?>

delivers only a small part of the image, resulting in a broken image tag (usually) or the top part of the image (sometimes). Whereas:

<?php
  include("someimage.gif");
?>

does deliver the entire image (or a parse error :)

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2001-02-22 05:46 UTC] auke at muze dot nl
I've been checking it a bit further, it seems that all filesystem read and write functions fail under the windows apache module.

fread and even fgetc will stop at char(26) and also, if they ancounter a 0D 0A (13 10, return+linefeed), even fgetc will only return a 0A. This is exactly the same behaviour as when it reads a single 0A, so there's no possible workaround. It seems simply impossible to read a binary file correctly. Even ftell seems to be in on the joke.

I've made a file containing ' 09 0D 0A 0A '
reading it with:

$curr=ftell($fp);
while ($char=fgetc($fp)) {
  $new=ftell($fp);
  if ($new>($curr+1)) {
    echo " 0D";
  }
  echo strtoupper(dechex(ord($char)));
  $curr=$new;
}

returns: 

09 0D 0A 0D 0A

ftell actually counts the nonexisting second 0D

btw. ftell also doesn't start at 0, if you do a fseek($fp, 0) and then a ftell($fp), it will return a semirandom number (at least I haven't found out what it is).
 [2001-02-22 06:53 UTC] sniper@php.net
This should be fixed in CVS already. Please try a dev build from http://www.php4win.de/

--Jani

 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Mar 29 12:01:27 2024 UTC