php / php/php-src

Unexpected path truncation of files contained in a tar file by `PharData::extractTo()`

Ouverte
#19,311 2 commentaires 0 réactions 1 personne assignée Voir sur GitHub

@ndossche y travaille déjà.

Depuis le 18/10/2025.

  • #19322 par @ndossche — ouverte
Bug Extension: phar Status: Verified
Langage dominant
C
Étoiles
40.4k
Forks
8.1k
Merge moyen
2 j 13 h
PR mergées (30 j)
96

Description

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.