Один tarball — восемь способов распаковки
The Hardest Tarball?
Автор собрал архив hardest.tar, который разные tar-утилиты и библиотеки распаковывают по-разному — всего восемь вариантов. GNU tar, BusyBox, Python, Go и Perl просто игнорируют размер у жёсткой ссылки. bsdtar записывает 512 байт в саму ссылку, 7-Zip и node-tar их пропускают, а R применяет размер к пустому файлу. .NET, Julia и uv такой архив отвергают. Это один из 134 каверзных tarball'ов в тестовом наборе автора tar-minefield.
Я считаю, что это лучшее, что можно сделать, даже если технически это не соответствует POSIX.
- Joker_vD
> Теперь POSIX говорит, что блоки данных для жёсткой ссылки «могут быть включены» в pax-архивы, но последствия этого не совсем ясны.
Как так? Если блоки данных включены, то это и есть предполагаемое содержимое файла, стоящего за этой жёсткой ссылкой. Они должны перезаписать предыдущее содержимое файла.
> Значит, 512 байт после жёсткой ссылки — это её данные, а не заголовок empty, как мы архивировали?
Да, именно так.
> Как у жёсткой ссылки может быть содержимое, отличное от её предыдущего файла-аналога?
Да очень просто: пока создавался архив, файл, стоящий за двумя разными жёсткими ссылками, изменился; утилита архивации это заметила и включила новое содержимое файла как содержимое для второй жёсткой ссылки вместо того, чтобы перемотать и перезаписать исходный файл в архиве (что, знаете ли, невозможно сделать на ленте). По крайней мере, я считаю, что именно в этом была причина такого разрешения и предполагаемое поведение при извлечении.
- JdeBP
Не хватает одной заметной реализации tar. paxmirabilis — это tar, cpio и pax в одном, как бинарник с несколькими вызовами. Именно её в Debian получают как pax, собственно.
* https://mbsd.evolvis.org/pax.htm
* https://manpages.debian.org/trixie/pax/index.html
Нет, это не bsdtar из libarchive. В мире BSD есть больше одного tar.
- bartvk
Этот парень — просто герой. Он даже добавил небольшую графику, чтобы показать, как выглядит этот «самый сложный tarball».
Внизу есть ссылка на гораздо больше пограничных случаев.
Мне это напоминает вот эту красоту: «Parsing JSON is a Minefield»
- molticrystal
>NET, Julia и tar-codec из uv — эти реализации отвергают tarball. Считаю, что это лучшее, что можно сделать, даже если технически это не соответствует POSIX.
Хотя это самый безопасный выбор, он наименее полезен; я всегда предпочту получить хоть что-то из архива, чем ничего. Повреждение или нерегулярность архива не должны препятствовать просмотру данных — только предупреждение и способ откатиться с оговорками о том, что можно извлечь.
- zahlman
> Этот tarball — один из 134 хитрых tarball'ов, которые я собираю и классифицирую в своём наборе тестов haampie/tar-minefield
Разве «tarpit» не более естественное название?