tarfile: Degenerate TARs with global PAX headers are not handled correctly
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 36k
- Métricas de merge de PRs
- Métricas de PR pendentes
Descrição
Bug report
Bug description:
It appears that tarfile.TarFile fails opening PAX TAR files if the only thing they contain is the global headers, no matter if created with the module or with the tar tool. The exception raised is tarfile.ReadError: end of file header. The tar executable handles those files perfectly.
Reproducer
import subprocess
import traceback
import tarfile
import sys
import io
#
# Non-empty Python-created files work
#
filename = "non_empty_python.tar"
with tarfile.TarFile(filename,
mode="w",
format=tarfile.PAX_FORMAT,
pax_headers=dict(abc="def")
) as t:
t.addfile(tarfile.TarInfo("ghi.txt"), io.BytesIO(b"ghi"))
subprocess.check_call(["tar", "tf", filename],
stdout=subprocess.DEVNULL)
with tarfile.TarFile(filename, mode="a"):
pass
#
# Non-empty tar-created files work
#
filename = "non_empty_tar.tar"
subprocess.check_call(["/bin/bash", "-c", f"""
tar -c -H pax --pax-option='foo=bar' -f {filename} \
-P --transform 's/.*/ghi.txt/' <(echo ghi)
"""])
subprocess.check_call(["tar", "tf", filename],
stdout=subprocess.DEVNULL)
with tarfile.TarFile(filename, mode="a"):
pass
#
# Empty Python-created files break
#
filename = "empty_python.tar"
with tarfile.TarFile(filename,
mode="w",
format=tarfile.PAX_FORMAT,
pax_headers=dict(abc="def")
) as t:
pass
subprocess.check_call(["tar", "tf", filename],
stdout=subprocess.DEVNULL)
try:
with tarfile.TarFile(filename, mode="a"):
pass
except Exception:
print(f"Opening empty Python-created PAX TAR {filename!r} failed:",
file=sys.stderr)
print(traceback.format_exc(), file=sys.stderr)
#
# Empty tar-created files break
#
filename = "empty_tar.tar"
subprocess.check_call(["/bin/bash", "-c", f"""
tar -c -H pax --pax-option='foo=bar' -f {filename} \
--files-from=/dev/null
"""])
subprocess.check_call(["tar", "tf", filename],
stdout=subprocess.DEVNULL)
try:
with tarfile.TarFile(filename, mode="a"):
pass
except Exception:
print(f"Opening empty tar-created PAX TAR {filename!r} failed:",
file=sys.stderr)
print(traceback.format_exc(), file=sys.stderr)
CPython versions tested on:
3.15
Operating systems tested on:
Linux
Linked PRs
- gh-149647
- gh-156792
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
Comece pelo reproducer e pelo caminho de abertura de tarfile.TarFile no modo append, concentrando-se em arquivos que contêm apenas cabeçalhos PAX globais. Adicione cobertura de regressão tanto para arquivos PAX vazios criados pelo Python quanto para os criados pelo tar e verifique se abri-los no modo "a" é bem-sucedido sem um ReadError.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- python
- Domínio
- tooling
- Tipo de issue
- Bug
- Dificuldade
- 3/5
- Tempo estimado
- 1-2 dias
- Status de atividade
- Estagnada
- Clareza
- Claramente especificada
- Facilidade para iniciantes
- 25/100