diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 646cf42c4a9c9..a509f7e01480c 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -2286,6 +2286,9 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert newentry.tar_type = (entry->is_dir ? TAR_DIR : TAR_FILE); } + /* The header offset is only used for unmodified zips. + * Once modified, phar_zip_changed_apply_int() will update the header_offset. */ + newentry.header_offset = 0; newentry.is_modified = 1; newentry.phar = phar; newentry.old_flags = newentry.flags & ~PHAR_ENT_COMPRESSION_MASK; /* remove compression from old_flags */ diff --git a/ext/phar/tests/gh16406.phpt b/ext/phar/tests/gh16406.phpt new file mode 100644 index 0000000000000..6df5fd3aab6db --- /dev/null +++ b/ext/phar/tests/gh16406.phpt @@ -0,0 +1,35 @@ +--TEST-- +GH-16406 (Assertion failure in ext/phar/phar.c:2808) +--EXTENSIONS-- +phar +zlib +--INI-- +phar.readonly=0 +phar.require_hash=0 +--FILE-- +'; +$files['b'] = 'b'; +$files['c'] = 'c'; +include __DIR__.'/files/phar_test.inc'; +$phar = new Phar($fname); +$phar->compressFiles(Phar::GZ); +$phar = $phar->convertToExecutable(Phar::TAR); +$phar = $phar->convertToExecutable(Phar::PHAR, Phar::GZ); +var_dump($phar['b']->openFile()->fread(4096)); +var_dump($phar['c']->openFile()->fread(4096)); +?> +--CLEAN-- + +--EXPECT-- +string(1) "b" +string(1) "c"