|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #65288 ZipArchive::getStatusString returns wrong error message
Submitted: 2013-07-18 14:15 UTC Modified: 2013-07-22 13:25 UTC
From: crayonviolent at phpfreaks dot com Assigned:
Status: Wont fix Package: Zip Related
PHP Version: Irrelevant OS: Irrelevant
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2013-07-18 14:15 UTC] crayonviolent at phpfreaks dot com
From the code below, if $file_name is a valid file found within $zip_file, the 
contents are echo'd just fine.  However, if the $file_name is not found, $fp 
returns false and getStatusString() is echo'd.  The problem is that it is echoing 
"No error".  Shouldn't it be returning "No such file" (ER_NOENT) ?

Maybe this is actually a bug with ZipArchive::getStream or a combo of both?

Test script:
/**** begin code ****/
$z = new ZipArchive();
if ($z->open($zip_file) !== true) {
  echo "File not found.";
  return false;
$fp = $z->getStream($file_name);
if (!$fp) {
  echo $z->getStatusString();
} else {
/***** end code ******/


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2013-07-19 07:20 UTC]
-Status: Open +Status: Feedback
 [2013-07-19 07:20 UTC]
In your example, it wouldn't even reach to getStream(). If there's no file, it'll 
not go through after open(). Please give an example reproducing the exact behavior 
you describe.
 [2013-07-19 22:41 UTC] crayonviolent at phpfreaks dot com
-Status: Feedback +Status: Open
 [2013-07-19 22:41 UTC] crayonviolent at phpfreaks dot com
Read the example code closer.  The zip is valid and will open. It is the non 
existant file IN the zip that getStream isn't returning a proper error on
 [2013-07-22 07:34 UTC]
Ok, now i see what you mean. Opening a nonexistent archive item. Lookiing through 
the history i can see that this is an intentional change to libzip on PHP side, 
look here
r1=260064&r2=260074 . Not sure it's gonna change. But you can use ->nameLocate() 
as a workaround for now.
 [2013-07-22 07:39 UTC]
-Status: Open +Status: Wont fix
 [2013-07-22 13:25 UTC] crayonviolent at phpfreaks dot com
Okay well thanks for the workaround...

But as an IMO.. getStream SHOULD return an error.  The commit comment says "Look 
for an entry should not raise an error".  Well the prefix of the function is 
"get" not "look".  getStream attempts to GET something, not just look to see if 
it exists.  If the purpose of the method were to ONLY check for existence, I 
would agree that if it does not find something, it should return false and no 
error should be passed to status (getStatusString). In other words, if it's ONLY 
job were to look for something, then the job would be complete. But the fact is, 
in this instance, getStream failed to complete its job. 

If I run getStream, as the name implies, I should expect to get a file stream.  
If not, I should instead receive a reason why it failed to do its job.  

Anyways, that's my 2 cents, thanks for looking into this, and thanks for the 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Sat May 30 14:01:24 2020 UTC