mirror of
https://github.com/php/php-src.git
synced 2025-08-18 15:08:55 +02:00
add checking for invalid alias on opening tar, and test
This commit is contained in:
parent
ad6e7fc667
commit
11c93b8494
7 changed files with 56 additions and 0 deletions
|
@ -284,8 +284,39 @@ int phar_open_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, i
|
||||||
if (!actual_alias && entry.filename_len == sizeof(".phar/alias.txt")-1 && !strncmp(entry.filename, ".phar/alias.txt", sizeof(".phar/alias.txt")-1)) {
|
if (!actual_alias && entry.filename_len == sizeof(".phar/alias.txt")-1 && !strncmp(entry.filename, ".phar/alias.txt", sizeof(".phar/alias.txt")-1)) {
|
||||||
size_t read;
|
size_t read;
|
||||||
/* found explicit alias */
|
/* found explicit alias */
|
||||||
|
if (size > 511) {
|
||||||
|
if (error) {
|
||||||
|
spprintf(error, 4096, "phar error: tar-based phar \"%s\" has alias that is larger than 511 bytes, cannot process", fname);
|
||||||
|
}
|
||||||
|
php_stream_close(fp);
|
||||||
|
zend_hash_destroy(&myphar->manifest);
|
||||||
|
myphar->manifest.arBuckets = 0;
|
||||||
|
zend_hash_destroy(&myphar->mounted_dirs);
|
||||||
|
myphar->mounted_dirs.arBuckets = 0;
|
||||||
|
efree(myphar);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
read = php_stream_read(fp, buf, size);
|
read = php_stream_read(fp, buf, size);
|
||||||
if (read == size) {
|
if (read == size) {
|
||||||
|
buf[size] = '\0';
|
||||||
|
if (!phar_validate_alias(buf, size)) {
|
||||||
|
if (size > 50) {
|
||||||
|
buf[50] = '.';
|
||||||
|
buf[51] = '.';
|
||||||
|
buf[52] = '.';
|
||||||
|
buf[53] = '\0';
|
||||||
|
}
|
||||||
|
if (error) {
|
||||||
|
spprintf(error, 4096, "phar error: invalid alias \"%s\" in tar-based phar \"%s\"", buf, fname);
|
||||||
|
}
|
||||||
|
php_stream_close(fp);
|
||||||
|
zend_hash_destroy(&myphar->manifest);
|
||||||
|
myphar->manifest.arBuckets = 0;
|
||||||
|
zend_hash_destroy(&myphar->mounted_dirs);
|
||||||
|
myphar->mounted_dirs.arBuckets = 0;
|
||||||
|
efree(myphar);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
actual_alias = estrndup(buf, size);
|
actual_alias = estrndup(buf, size);
|
||||||
myphar->alias = actual_alias;
|
myphar->alias = actual_alias;
|
||||||
myphar->alias_len = size;
|
myphar->alias_len = size;
|
||||||
|
|
25
ext/phar/tests/tar/badalias.phpt
Normal file
25
ext/phar/tests/tar/badalias.phpt
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
--TEST--
|
||||||
|
Phar: invalid aliases
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("phar")) die("skip"); ?>
|
||||||
|
<?php if (!extension_loaded("zlib")) die("skip no zlib"); ?>
|
||||||
|
<?php if (!extension_loaded("bz2")) die("skip no bz2"); ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$e = dirname(__FILE__) . '/files/';
|
||||||
|
for ($i = 1; $i <= 5; $i++) {
|
||||||
|
try {
|
||||||
|
new Phar($e . "badalias$i.phar.tar");
|
||||||
|
} catch (Exception $ee) {
|
||||||
|
echo $ee->getMessage(), "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
===DONE===
|
||||||
|
--EXPECTF--
|
||||||
|
phar error: invalid alias "hi/thereaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..." in tar-based phar "%sbadalias1.phar.tar"
|
||||||
|
phar error: invalid alias "hi\there" in tar-based phar "%sbadalias2.phar.tar"
|
||||||
|
phar error: invalid alias "hi;there" in tar-based phar "%sbadalias3.phar.tar"
|
||||||
|
phar error: invalid alias "hi:there" in tar-based phar "%sbadalias4.phar.tar"
|
||||||
|
phar error: tar-based phar "%sbadalias5.phar.tar" has alias that is larger than 511 bytes, cannot process
|
||||||
|
===DONE===
|
BIN
ext/phar/tests/tar/files/badalias1.phar.tar
Normal file
BIN
ext/phar/tests/tar/files/badalias1.phar.tar
Normal file
Binary file not shown.
BIN
ext/phar/tests/tar/files/badalias2.phar.tar
Normal file
BIN
ext/phar/tests/tar/files/badalias2.phar.tar
Normal file
Binary file not shown.
BIN
ext/phar/tests/tar/files/badalias3.phar.tar
Normal file
BIN
ext/phar/tests/tar/files/badalias3.phar.tar
Normal file
Binary file not shown.
BIN
ext/phar/tests/tar/files/badalias4.phar.tar
Normal file
BIN
ext/phar/tests/tar/files/badalias4.phar.tar
Normal file
Binary file not shown.
BIN
ext/phar/tests/tar/files/badalias5.phar.tar
Normal file
BIN
ext/phar/tests/tar/files/badalias5.phar.tar
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue