Unexpected path truncation of files contained in a tar file by `PharData::extractTo()`
オープン
Bug
Extension: phar
Status: Verified
- 主要言語
- C
- スター
- 40.4k
- フォーク
- 8.1k
- 平均マージ
- 2日 13時間
- マージ済み PR(30日)
- 96
説明
Description
The following code:
<?php
$long_path = 'a-very-long-path/to-a-file/with-a-very-long-name/in-a-deep-directory-structure';
if (!is_dir($long_path)) {
mkdir($long_path, recursive: true);
touch($long_path . '/a-php-file-with-a-very-long-name.php');
}
foreach (['ustar', 'posix', 'gnu'] as $format) {
echo sprintf('Format: %s', $format) . PHP_EOL;
$archive = sprintf('archive-%s.tar', $format);
$tpm_dir = sys_get_temp_dir() . '/' . $format . '-' . bin2hex(random_bytes(10));
$command = sprintf('tar --create --file=%s --format=%s a-very-long-path', $archive, $format);
exec($command);
$tar = new PharData($archive);
$tar->extractTo($tpm_dir, overwrite: true);
$dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($tpm_dir));
foreach ($dir as $file) {
if (!$file->isFile()) {
continue;
}
echo '> ' . str_replace($tpm_dir . '/', '', $file->getRealPath()) . PHP_EOL;
}
echo PHP_EOL;
}
Resulted in this output:
Format: ustar
> a-very-long-path/to-a-file/with-a-very-long-name/in-a-deep-directory-structure/a-php-file-with-a-very-long-name.php
Format: posix
> a-very-long-path/to-a-file/with-a-very-long-name/in-a-deep-directory-structure/a-php-file-with-a-ver
Format: gnu
> a-very-long-path/to-a-file/with-a-very-long-name/in-a-deep-directory-structure/a-php-file-with-a-very-long-name.php
But I expected this output instead:
Format: ustar
> a-very-long-path/to-a-file/with-a-very-long-name/in-a-deep-directory-structure/a-php-file-with-a-very-long-name.php
Format: posix
> a-very-long-path/to-a-file/with-a-very-long-name/in-a-deep-directory-structure/a-php-file-with-a-very-long-name.php
Format: gnu
> a-very-long-path/to-a-file/with-a-very-long-name/in-a-deep-directory-structure/a-php-file-with-a-very-long-name.php
I did not find a clear summary of the different tar formats limitations, but as far as I understand,
As described in https://www.gnu.org/software/tar/manual/html_section/Formats.html, the pax tar format (POSIX 1003.1-2001) should not have this 100 chars limitation on the files path.
When extracted with the tar utility, the paths are not truncated.
PHP Version
PHP 8.4.10 (cli) (built: Jul 22 2025 01:19:35) (NTS)
Copyright (c) The PHP Group
Built by https://github.com/docker-library/php
Zend Engine v4.4.10, Copyright (c) Zend Technologies
with Zend OPcache v8.4.10, Copyright (c), by Zend Technologies
with Xdebug v3.4.5, Copyright (c) 2002-2025, by Derick Rethans
Operating System
PHP docker image based on Debian, executed on Ubuntu 24.04
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
評価
この issue はまだ評価されていません。