1
0
mirror of https://github.com/php/php-src.git synced 2026-04-25 17:08:14 +02:00
Files
archived-php-src/ext/phar/tests/phar_extract.phpt
T
Nikita Popov 7e339a335e Make null byte error a ValueError
Currently we treat paths with null bytes as a TypeError, which is
incorrect, and rather inconsistent, as we treat empty paths as
ValueError. We do this because the error is generated by zpp and
it's easier to always throw TypeError there.

This changes the zpp implementation to throw a TypeError only if
the type is actually wrong and throw ValueError for null bytes.
The error message is also split accordingly, to be more precise.

Closes GH-6094.
2020-09-08 15:23:23 +02:00

154 lines
4.1 KiB
PHP

--TEST--
Phar: Phar::extractTo()
--SKIPIF--
<?php if (!extension_loaded("phar")) die("skip"); ?>
--CONFLICTS--
tempmanifest1.phar.php
--INI--
phar.readonly=0
--FILE--
<?php
$fname = __DIR__ . '/tempmanifest1.phar.php';
$pname = 'phar://' . $fname;
$a = new Phar($fname);
$a['file1.txt'] = 'hi';
$a['file2.txt'] = 'hi2';
$a['subdir/ectory/file.txt'] = 'hi3';
$a->mount($pname . '/mount', __FILE__);
$a->addEmptyDir('one/level');
$a->extractTo(__DIR__ . '/extract', 'mount');
$a->extractTo(__DIR__ . '/extract');
$out = array();
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__ . '/extract', 0x00003000), RecursiveIteratorIterator::CHILD_FIRST) as $p => $b) {
$out[] = $p;
}
sort($out);
foreach ($out as $b) {
echo "$b\n";
}
$a->extractTo(__DIR__ . '/extract1', 'file1.txt');
var_dump(file_get_contents(__DIR__ . '/extract1/file1.txt'));
$a->extractTo(__DIR__ . '/extract1', 'subdir/ectory/file.txt');
var_dump(file_get_contents(__DIR__ . '/extract1/subdir/ectory/file.txt'));
$a->extractTo(__DIR__ . '/extract1-2', array('file2.txt', 'one/level'));
var_dump(file_get_contents(__DIR__ . '/extract1-2/file2.txt'));
var_dump(is_dir(__DIR__ . '/extract1-2/one/level'));
try {
$a->extractTo(__DIR__ . '/whatever', new stdClass());
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
}
try {
$a->extractTo(array());
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
}
try {
$a->extractTo('');
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
file_put_contents(__DIR__ . '/oops', 'I is file');
try {
$a->extractTo(__DIR__ . '/oops', 'file1.txt');
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
try {
$a->extractTo(__DIR__ . '/oops1', array(array(), 'file1.txt'));
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
try {
$a->extractTo(__DIR__ . '/extract', 'file1.txt');
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
file_put_contents(__DIR__ . '/extract/file1.txt', 'first');
var_dump(file_get_contents(__DIR__ . '/extract/file1.txt'));
$a->extractTo(__DIR__ . '/extract', 'file1.txt', true);
var_dump(file_get_contents(__DIR__ . '/extract/file1.txt'));
try {
$a->extractTo(str_repeat('a', 20000), 'file1.txt');
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
$a[str_repeat('a', 20000)] = 'long';
try {
$a->extractTo(__DIR__ . '/extract', str_repeat('a', 20000));
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
--CLEAN--
<?php
@rmdir(__DIR__ . '/whatever');
@unlink(__DIR__ . '/oops');
@rmdir(__DIR__ . '/oops1');
@unlink(__DIR__ . '/tempmanifest1.phar.php');
$e = __DIR__ . '/extract/';
@unlink($e . 'file1.txt');
@unlink($e . 'file2.txt');
@unlink($e . 'subdir/ectory/file.txt');
@rmdir($e . 'subdir/ectory');
@rmdir($e . 'subdir');
@rmdir($e . 'one/level');
@rmdir($e . 'one');
@rmdir($e);
$e = __DIR__ . '/extract1/';
@unlink($e . 'file1.txt');
@unlink($e . 'subdir/ectory/file.txt');
@rmdir($e . 'subdir/ectory');
@rmdir($e . 'subdir');
@rmdir($e);
$e = __DIR__ . '/extract1-2/';
@unlink($e . 'file2.txt');
@rmdir($e . 'one/level');
@rmdir($e . 'one');
@rmdir($e);
?>
--EXPECTF--
%sextract%cfile1.txt
%sextract%cfile2.txt
%sextract%cone
%sextract%csubdir
%sextract%csubdir%cectory
%sextract%csubdir%cectory%cfile.txt
string(2) "hi"
string(3) "hi3"
string(3) "hi2"
bool(false)
Phar::extractTo(): Argument #2 ($files) must be of type array|string|null, stdClass given
Phar::extractTo(): Argument #1 ($pathto) must be of type string, array given
Invalid argument, extraction path must be non-zero length
Unable to use path "%soops" for extraction, it is a file, must be a directory
Invalid argument, array of filenames to extract contains non-string value
Extraction from phar "%stempmanifest1.phar.php" failed: Cannot extract "file1.txt" to "%sextract/file1.txt", path already exists
string(5) "first"
string(2) "hi"
Cannot extract to "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...", destination directory is too long for filesystem
Extraction from phar "%stempmanifest1.phar.php" failed: Cannot extract "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..." to "%s...", extracted filename is too long for filesystem