You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Renaming a file in a Phar to an already existing filename causes a NULL pointer dereference #13836
--TEST--
Phar: PHP bug #47085: "rename() returns true even if the file in PHAR does not exist"
--EXTENSIONS--
phar
--INI--
phar.require_hash=0
phar.readonly=0
--FILE--
<?php
$fname = __DIR__ . '/' . basename(__FILE__, '.php') . '.phar';
$phar = new Phar($fname, 0, 'a.phar');
$phar['x'] = 'hi';
unset($phar);
rename("phar://a.phar/x", "phar://a.phar/y");
var_dump(rename("phar://a.phar/x", "phar://a.phar/y"));
?>
--CLEAN--
<?php unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar');?>
--EXPECTF--
Warning: rename(): phar error: cannot rename "phar://a.phar/x" to "phar://a.phar/y" from extracted phar archive, source does not exist in %sbug47085.php on line %d
bool(false)
Output:
/php-src/ext/phar/stream.c:864:10: runtime error: member access within null pointer of type 'phar_entry_info' (aka 'struct _phar_entry_info')
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /php-src/ext/phar/stream.c:864:10 in
Tested with ASAN, UBSAN, and Valgrind with both USE_ZEND_ALLOC=0 and USE_ZEND_ALLOC=1, also tested with debug and without debug; but I can't reproduce this...
Please give more information about how you ran this test, info about your php.ini, and what configuration options you used. I'm testing on commit f2b2b7f.
It seems it reproduces only starting from the second execution because the clean section doesn't actually clean it outside run-tests.php.
What's actually going on is that if you rename a file to a filename that already exists, it crashes. This is because it uses the add api to add a new entry for the new filename, but that returns NULL because the entry exists already. That's why it only works after loading the existing phar that has the y file.
Since this never worked before, we can just error out properly, similar to what copy does. EDIT: actually Phar::copy throws while copy succeeds so we should follow the latter.
changed the title [-]Member access within null pointer of type 'phar_entry_info' (aka 'struct _phar_entry_info') in /ext/phar/stream.c[/-][+]Renaming a file in a Phar to an already existing filename causes a NULL pointer dereference[/+]on Mar 30, 2024
Activity
ndossche commentedon Mar 29, 2024
Tested with ASAN, UBSAN, and Valgrind with both USE_ZEND_ALLOC=0 and USE_ZEND_ALLOC=1, also tested with debug and without debug; but I can't reproduce this...
Please give more information about how you ran this test, info about your php.ini, and what configuration options you used. I'm testing on commit f2b2b7f.
YuanchengJiang commentedon Mar 30, 2024
scripts to reproduce:
ndossche commentedon Mar 30, 2024
Thanks, it reproduces now; what was missing was running under opcache, and running it outside run-tests.php.
ndossche commentedon Mar 30, 2024
It seems it reproduces only starting from the second execution because the clean section doesn't actually clean it outside run-tests.php.
What's actually going on is that if you rename a file to a filename that already exists, it crashes. This is because it uses the
addapi to add a new entry for the new filename, but that returns NULL because the entry exists already. That's why it only works after loading the existing phar that has theyfile.Since this never worked before, we can just error out properly, similar to what
copydoes. EDIT: actuallyPhar::copythrows whilecopysucceeds so we should follow the latter.[-]Member access within null pointer of type 'phar_entry_info' (aka 'struct _phar_entry_info') in /ext/phar/stream.c[/-][+]Renaming a file in a Phar to an already existing filename causes a NULL pointer dereference[/+]Merge branch 'PHP-8.3'