php / php/php-src

Unexpected Error in ZipArchive::close

Open
#13,185 1 comment 1 reaction 1 assignee View on GitHub

@remicollet is already working on this.

Since Jan 18, 2024.

Bug Extension: zip Status: Needs Triage
Dominant language
C
Stars
40.4k
Forks
8.1k
Avg merge
2d 13h
Merged PRs (30d)
96

Description

Description

There seems to have been a change between Php7 and Php8 whereby ZipArchive::close can issue a fatal error rather than a warning. This is a big change in behavior. Was it intended? Nothing in the documentation for the method suggests an error, let alone a fatal error, can be issued. The second close below is obviously wrong and should return false, but why should it be treated as fatal?

The following code:

<?php
$zip = new ZipArchive();
$res = $zip->open('zzip.zip', ZipArchive::OVERWRITE | ZipArchive::CREATE);
if ($res !== true) {
    echo "open failed result=$res\n";
    exit(1);
}
$zip->addFromString('test.txt', 'file content goes here');
$zip->close();
$x = @$zip->close();
var_dump($x);

Resulted in this output:

Fatal error: Uncaught ValueError: Invalid or uninitialized Zip object in C:\git\zzip.php on line 10

ValueError: Invalid or uninitialized Zip object in C:\git\zzip.php on line 10

Call Stack:
    0.0002     394520   1. {main}() C:\git\zzip.php:0
    0.0085     395152   2. ZipArchive->close() C:\git\zzip.php:10

But I expected this output instead (as with Php7):

C:\git\zzip.php:11:
bool(false)
PHP Version

All Php8

Operating System

Windows, but probably all

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.