diff --git a/NEWS b/NEWS index 33697acf622..0472345f2ab 100644 --- a/NEWS +++ b/NEWS @@ -65,6 +65,9 @@ PHP NEWS . Fixed bug GH-16433 (Large values for openssl_csr_sign() $days overflow). (cmb) +- Phar: + . Fixed bug GH-16406 (Assertion failure in ext/phar/phar.c:2808). (nielsdos) + - PHPDBG: . Fixed bug GH-16174 (Empty string is an invalid expression for ev). (cmb) diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 4a2f8726191..25f0d7d9fa6 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -2308,6 +2308,9 @@ no_copy: 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 00000000000..6df5fd3aab6 --- /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"