tarfile: Extracting symlink using extractfile results in Keyerror: linkname not found
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
I have the following tar archive containing some files and a symlink to a file that is not part of the tar archive.
drwxr-xr-x guif/users 0 2024-08-06 15:51 test/
-rw-r--r-- guif/users 0 2024-08-06 15:50 test/file3
lrwxrwxrwx guif/users 0 2024-08-06 15:51 test/mylink -> /usr/bin/env
-rw-r--r-- guif/users 0 2024-08-06 15:50 test/file1
-rw-r--r-- guif/users 0 2024-08-06 15:50 test/file2
I want to extract the symlink. With the getmember method I receive a valid member of the tar archive.
Using this member in the extractfile however results in an error.
#!/usr/bin/env python
import tarfile
def main():
with tarfile.open('./test.tar') as tar_file:
member = tar_file.getmember('test/mylink')
file_content = tar_file.extractfile(member)
if __name__ == '__main__':
main()
Traceback (most recent call last):
File "/home/guif/repos/private/tmp/./main.py", line 13, in <module>
main()
File "/home/guif/repos/private/tmp/./main.py", line 9, in main
file_content = tar_file.extractfile(member)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/nix/store/l014xp1qxdl6gim3zc0jv3mpxhbp346s-python3-3.12.4/lib/python3.12/tarfile.py", line 2385, in extractfile
return self.extractfile(self._find_link_target(tarinfo))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/nix/store/l014xp1qxdl6gim3zc0jv3mpxhbp346s-python3-3.12.4/lib/python3.12/tarfile.py", line 2725, in _find_link_target
raise KeyError("linkname %r not found" % linkname)
KeyError: "linkname 'test//usr/bin/env' not found"
As you can see 'test//usr/bin/env can not be found.
The path does not look like the symlink I try to extract but more like <symlink name>/<link target>
From the doc:
Extract a member from the archive as a file object. `member' may be
a filename or a TarInfo object. If `member' is a regular file or
a link, an io.BufferedReader object is returned. For all other
existing members, None is returned. If `member' does not appear
in the archive, KeyError is raised.
CPython versions tested on:
3.10, 3.12
Operating systems tested on:
Linux
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Lisez tarfile.py autour de extractfile() et _find_link_target(), puis exécutez l’archive et le script fournis pour reproduire le KeyError. Comparez le comportement documenté pour les liens avec ce cas de cible externe et ajoutez une couverture de régression qui rende explicite le résultat attendu.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- tooling
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100