Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 55 additions & 8 deletions ext/phar/phar_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -2046,7 +2046,7 @@ static int phar_copy_file_contents(phar_entry_info *entry, php_stream *fp) /* {{
}
/* }}} */

static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext, zend_bool compress) /* {{{ */
static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /* {{{ */
{
const char *oldname = NULL;
phar_archive_data *phar = *sphar;
Expand All @@ -2058,10 +2058,29 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext, ze
char *error;
const char *pcr_error;
int ext_len = ext ? strlen(ext) : 0;
size_t new_len, oldname_len;
size_t new_len, oldname_len, phar_ext_len;
phar_archive_data *pphar = NULL;
php_stream_statbuf ssb;

int phar_ext_list_len, i = 0;
char *ext_pos = NULL;
/* Array of PHAR extensions, Must be in order, starting with longest
* ending with the shortest. */
char *phar_ext_list[] = {
".phar.tar.bz2",
".phar.tar.gz",
".phar.php",
".phar.bz2",
".phar.zip",
".phar.tar",
".phar.gz",
".tar.bz2",
".tar.gz",
".phar",
".tar",
".zip"
};

if (!ext) {
if (phar->is_zip) {

Expand Down Expand Up @@ -2118,20 +2137,48 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext, ze
return NULL;
}

if (ext[0] == '.') {
++ext;
}

oldpath = estrndup(phar->fname, phar->fname_len);
if ((oldname = zend_memrchr(phar->fname, '/', phar->fname_len))) {
++oldname;
} else {
oldname = phar->fname;
}
oldname_len = strlen(oldname);

oldname_len = strlen(oldname);
/* Copy the old name to create base for the new name */
basename = estrndup(oldname, oldname_len);
spprintf(&newname, 0, "%s.%s", strtok(basename, "."), ext);

phar_ext_list_len = sizeof(phar_ext_list)/sizeof(phar_ext_list[0]);
/* Remove possible PHAR extensions */
/* phar_ext_list must be in order of longest extension to shortest */
for (i=0; i < phar_ext_list_len; i++) {
phar_ext_len = strlen(phar_ext_list[i]);
if (phar_ext_len && oldname_len > phar_ext_len) {
/* Check if the basename strings ends with the extension */
if (memcmp(phar_ext_list[i], basename + (oldname_len - phar_ext_len), phar_ext_len) == 0) {
ext_pos = basename + (oldname_len - phar_ext_len);
ext_pos[0] = '\0';
break;
}
}
ext_pos = NULL;
}

/* If no default PHAR extension found remove the last extension */
if (!ext_pos) {
ext_pos = strrchr(basename, '.');
if (ext_pos) {
ext_pos[0] = '\0';
}
}
ext_pos = NULL;

if (ext[0] == '.') {
++ext;
}
/* Append extension to the basename */
spprintf(&newname, 0, "%s.%s", basename, ext);
efree(basename);

basepath = estrndup(oldpath, (strlen(oldpath) - oldname_len));
Expand Down Expand Up @@ -2348,7 +2395,7 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert
phar_add_virtual_dirs(phar, newentry.filename, newentry.filename_len);
} ZEND_HASH_FOREACH_END();

if ((ret = phar_rename_archive(&phar, ext, 0))) {
if ((ret = phar_rename_archive(&phar, ext))) {
return ret;
} else {
if(phar != NULL) {
Expand Down
6 changes: 3 additions & 3 deletions ext/phar/tests/bug48377.2.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -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, 'phar.zip');
} catch (BadMethodCallException $e) {
echo $e->getMessage(),"\n";
}
Expand All @@ -21,5 +21,5 @@ try {
--CLEAN--
<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');?>
--EXPECTF--
data phar "%sbug48377.2.phar.zip" has invalid extension 2.phar.zip
===DONE===
data phar "%sbug48377.2.phar.zip" has invalid extension phar.zip
===DONE===
Binary file added ext/phar/tests/bug74196.1.2.3.phar.tar.gz
Binary file not shown.
23 changes: 23 additions & 0 deletions ext/phar/tests/bug74196.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
--TEST--
PHP bug #74196: PharData->decompress() does not correctly support dot names
--SKIPIF--
<?php if (!extension_loaded("phar")) die("skip"); ?>
<?php if (!extension_loaded("zlib")) die("skip"); ?>
--INI--
phar.require_hash=0
phar.readonly=0
--FILE--
<?php
$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.1.2.3.phar.tar.gz';
$decompressed_name = str_replace( ".gz", "", $fname);
var_dump(file_exists($fname));

$phar = new Phar($fname);
$phar->decompress();
var_dump(file_exists($decompressed_name));
unlink($decompressed_name);

?>
--EXPECTF--
bool(true)
bool(true)
6 changes: 3 additions & 3 deletions ext/phar/tests/phar_convert_repeated.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,10 @@ 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.2.phar.zip');
unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.2.2.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') . '.2.2.2.3.phar.zip');
unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar.tar');
unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.3.phar');
?>
Expand Down
10 changes: 6 additions & 4 deletions ext/phar/tests/phar_convert_repeated_b.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -74,17 +74,19 @@ try {
} catch(Exception $e) {
echo $e->getMessage()."\n";
}

?>
===DONE===
--CLEAN--
<?php
<?php
echo dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.gz' . "\n";

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') . '.1.2.tar');
unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');
unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.zip');

?>
--EXPECT--
=================== new PharData() ==================
Expand Down Expand Up @@ -115,4 +117,4 @@ string(0) ""
NULL
================= convertToPhar() ====================
Cannot write out executable phar archive, phar is read-only
===DONE===
===DONE===
4 changes: 2 additions & 2 deletions ext/phar/tests/stat2_5.3.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ $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, '.phar.tar');
unset($a);
Phar::unlinkArchive($fname2);
$b['foo/stat.php'] = '<?php
Expand Down Expand Up @@ -58,4 +58,4 @@ bool(false)
dir
bool(true)
bool(false)
===DONE===
===DONE===