Один 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.
  1. Joker_vD

    > Теперь POSIX говорит, что блоки данных для жёсткой ссылки «могут быть включены» в pax-архивы, но последствия этого не совсем ясны.

    Как так? Если блоки данных включены, то это и есть предполагаемое содержимое файла, стоящего за этой жёсткой ссылкой. Они должны перезаписать предыдущее содержимое файла.

    > Значит, 512 байт после жёсткой ссылки — это её данные, а не заголовок empty, как мы архивировали?

    Да, именно так.

    > Как у жёсткой ссылки может быть содержимое, отличное от её предыдущего файла-аналога?

    Да очень просто: пока создавался архив, файл, стоящий за двумя разными жёсткими ссылками, изменился; утилита архивации это заметила и включила новое содержимое файла как содержимое для второй жёсткой ссылки вместо того, чтобы перемотать и перезаписать исходный файл в архиве (что, знаете ли, невозможно сделать на ленте). По крайней мере, я считаю, что именно в этом была причина такого разрешения и предполагаемое поведение при извлечении.

  2. 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.

  3. bartvk

    Этот парень — просто герой. Он даже добавил небольшую графику, чтобы показать, как выглядит этот «самый сложный tarball».

    Внизу есть ссылка на гораздо больше пограничных случаев.

    Мне это напоминает вот эту красоту: «Parsing JSON is a Minefield»

    https://news.ycombinator.com/item?id=16897061

  4. molticrystal

    >NET, Julia и tar-codec из uv — эти реализации отвергают tarball. Считаю, что это лучшее, что можно сделать, даже если технически это не соответствует POSIX.

    Хотя это самый безопасный выбор, он наименее полезен; я всегда предпочту получить хоть что-то из архива, чем ничего. Повреждение или нерегулярность архива не должны препятствовать просмотру данных — только предупреждение и способ откатиться с оговорками о том, что можно извлечь.

  5. zahlman

    > Этот tarball — один из 134 хитрых tarball'ов, которые я собираю и классифицирую в своём наборе тестов haampie/tar-minefield

    Разве «tarpit» не более естественное название?

Ещё за этот день

2026-11-10