diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index e276613209f05..40d4539ff5424 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -2003,7 +2003,8 @@ static zend_object *phar_rename_archive(phar_archive_data *phar, char *ext, zend const char *oldname = NULL; char *oldpath = NULL; char *basename = NULL, *basepath = NULL; - char *newname = NULL, *newpath = NULL; + char *newbasename = NULL, *newname = NULL, *newpath = NULL; + char *oldname_ext = NULL; zval ret, arg1; zend_class_entry *ce; char *error; @@ -2074,18 +2075,33 @@ static zend_object *phar_rename_archive(phar_archive_data *phar, char *ext, zend } oldpath = estrndup(phar->fname, phar->fname_len); - if ((oldname = zend_memrchr(phar->fname, '/', phar->fname_len))) { - ++oldname; - } else { - oldname = phar->fname; - } + oldname = zend_memrchr(phar->fname, '/', phar->fname_len); + ++oldname; oldname_len = strlen(oldname); basename = estrndup(oldname, oldname_len); - spprintf(&newname, 0, "%s.%s", strtok(basename, "."), ext); - efree(basename); + + /* find extension name: .phar suffixed with anything and .zip* and .tar* without .phar for data archives */ + oldname_ext = strstr(basename, ".phar"); + if (oldname_ext == NULL) { + oldname_ext = strstr(basename, ".tar"); + if (oldname_ext == NULL) { + oldname_ext = strstr(basename, ".tgz"); + if (oldname_ext == NULL) { + oldname_ext = strstr(basename, ".zip"); + } + } + } + + newbasename = basename; + if (oldname_ext != NULL) { + newbasename = estrndup(basename, (oldname_ext - basename)); + } + spprintf(&newname, 0, "%s.%s", newbasename, ext); + efree(newbasename); + efree(basename); basepath = estrndup(oldpath, (strlen(oldpath) - oldname_len)); phar->fname_len = spprintf(&newpath, 0, "%s%s", basepath, newname); diff --git a/ext/phar/tests/bug48377.2.phpt b/ext/phar/tests/bug48377.2.phpt index be2a0e1036080..6f63dc3f42884 100644 --- a/ext/phar/tests/bug48377.2.phpt +++ b/ext/phar/tests/bug48377.2.phpt @@ -12,7 +12,7 @@ $fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip'; $phar = new PharData($fname); $phar['x'] = 'hi'; try { - $phar->convertToData(Phar::ZIP, Phar::NONE, '.2.phar.zip'); + $phar->convertToData(Phar::ZIP, Phar::NONE, 'zip'); } catch (BadMethodCallException $e) { echo $e->getMessage(),"\n"; } @@ -21,5 +21,5 @@ try { --CLEAN-- --EXPECTF-- -data phar "%sbug48377.2.phar.zip" has invalid extension 2.phar.zip +Unable to add newly converted phar "%sbug48377.2.zip" to the list of phars, a phar with that name already exists ===DONE=== \ No newline at end of file diff --git a/ext/phar/tests/bug60953.phpt b/ext/phar/tests/bug60953.phpt new file mode 100644 index 0000000000000..2fa356c6d4347 --- /dev/null +++ b/ext/phar/tests/bug60953.phpt @@ -0,0 +1,26 @@ +--TEST-- +Phar: rename test +--SKIPIF-- + +--INI-- +phar.readonly=0 +phar.require_hash=0 +--FILE-- +stopBuffering(); +unset($phar); +$phar = new Phar(__DIR__ . '/package-1.2.3.phar'); +$phar->convertToExecutable(Phar::TAR, Phar::GZ); +var_dump(file_exists(__DIR__ . '/package-1.2.3.phar')); +var_dump(file_exists(__DIR__ . '/package-1.2.3.phar.tar.gz')); +?> +--CLEAN-- + +--EXPECTF-- +bool(true) +bool(true) \ No newline at end of file diff --git a/ext/phar/tests/phar_convert_repeated.phpt b/ext/phar/tests/phar_convert_repeated.phpt index e4b1fe41d770c..79360b2a4be0b 100644 --- a/ext/phar/tests/phar_convert_repeated.phpt +++ b/ext/phar/tests/phar_convert_repeated.phpt @@ -50,7 +50,7 @@ var_dump($phar->getAlias()); echo "================= convertToPhar() ====================\n"; -$phar = $phar->convertToExecutable(Phar::PHAR, Phar::NONE, '.2.phar'); +$phar = $phar->convertToExecutable(Phar::PHAR, Phar::NONE, '.phar.pharfile'); var_dump($phar->isFileFormat(Phar::PHAR)); var_dump($phar->isFileFormat(Phar::TAR)); var_dump($phar->isFileFormat(Phar::ZIP)); @@ -59,7 +59,7 @@ var_dump($phar->getAlias()); echo "================= convertToZip() =====================\n"; -$phar = $phar->convertToExecutable(Phar::ZIP, Phar::NONE, '.2.phar.zip'); +$phar = $phar->convertToExecutable(Phar::ZIP, Phar::NONE, '.phar.zipfile'); var_dump($phar->isFileFormat(Phar::PHAR)); var_dump($phar->isFileFormat(Phar::TAR)); var_dump($phar->isFileFormat(Phar::ZIP)); @@ -68,7 +68,7 @@ var_dump($phar->getAlias()); echo "================= convertToTar() =====================\n"; -$phar = $phar->convertToExecutable(Phar::TAR, Phar::NONE, '2.phar.tar'); +$phar = $phar->convertToExecutable(Phar::TAR, Phar::NONE, '.phar.tarfile'); var_dump($phar->isFileFormat(Phar::PHAR)); var_dump($phar->isFileFormat(Phar::TAR)); var_dump($phar->isFileFormat(Phar::ZIP)); @@ -77,7 +77,7 @@ var_dump($phar->getAlias()); echo "================= convertToZip() =====================\n"; -$phar = $phar->convertToExecutable(Phar::ZIP, Phar::NONE, '3.phar.zip'); +$phar = $phar->convertToExecutable(Phar::ZIP, Phar::NONE, '.phar.zip2'); var_dump($phar->isFileFormat(Phar::PHAR)); var_dump($phar->isFileFormat(Phar::TAR)); var_dump($phar->isFileFormat(Phar::ZIP)); @@ -91,12 +91,12 @@ var_dump($phar->getAlias()); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip'); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar'); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar'); -unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.zip'); -unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar.tar'); -unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.phar'); -unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar.zip'); -unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar.tar'); -unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zipfile'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tarfile'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.pharfile'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zipfile'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tarfile'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip2'); ?> --EXPECTF-- =================== new Phar() ======================= diff --git a/ext/phar/tests/phar_convert_repeated_b.phpt b/ext/phar/tests/phar_convert_repeated_b.phpt index 10e6973254b6c..51b979fef2f63 100644 --- a/ext/phar/tests/phar_convert_repeated_b.phpt +++ b/ext/phar/tests/phar_convert_repeated_b.phpt @@ -82,9 +82,9 @@ try { unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.gz'); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.tar.gz'); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.tar'); -unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.tar'); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip'); unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.zip'); +unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.2.tar'); ?> --EXPECT-- =================== new PharData() ================== diff --git a/ext/phar/tests/stat2_5.3.phpt b/ext/phar/tests/stat2_5.3.phpt index aba2a6417de55..d65e8ddc367a4 100644 --- a/ext/phar/tests/stat2_5.3.phpt +++ b/ext/phar/tests/stat2_5.3.phpt @@ -14,10 +14,9 @@ is_link(); var_dump(is_file(__FILE__)); $fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.tar'; -$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar'; copy(dirname(__FILE__) . '/tar/files/links.tar', $fname2); $a = new PharData($fname2); -$b = $a->convertToExecutable(Phar::TAR, Phar::NONE, '.3.phar.tar'); +$b = $a->convertToExecutable(Phar::TAR, Phar::NONE); unset($a); Phar::unlinkArchive($fname2); $b['foo/stat.php'] = 'addEmptyDir('foo/bar/blah'); $b->setStub(' ===DONE=== --CLEAN--