Skip to content

fix(multiarc/targz): handle GNUTYPE_LONGLINK for hard links with long…#3415

Open
Favorite6233 wants to merge 1 commit into
elfmz:masterfrom
Favorite6233:master
Open

fix(multiarc/targz): handle GNUTYPE_LONGLINK for hard links with long…#3415
Favorite6233 wants to merge 1 commit into
elfmz:masterfrom
Favorite6233:master

Conversation

@Favorite6233

@Favorite6233 Favorite6233 commented May 29, 2026

Copy link
Copy Markdown
Contributor

fix(multiarc/targz): handle GNUTYPE_LONGLINK for hard links with long paths

TAR archives with hard links whose target path exceeds 100 characters
use a GNUTYPE_LONGLINK ('K') header block to store the full link name.
Previously this data was incorrectly stored in LongName (shared with
GNUTYPE_LONGNAME) and then applied to PathName instead of LinkName,
causing far2l to return GETARC_BROKEN when browsing such archives.

Note: this fix applies to the built-in TAR parser in targz.cpp, which
is used when libarchive is unavailable. When libarchive is present,
far2l delegates TAR parsing to it and this code path is not used.

Changes:

  • Add separate LongLink vector to store GNUTYPE_LONGLINK data
  • Route GNUTYPE_LONGLINK records into LongLink instead of LongName
  • Apply LongLink to Info->LinkName when present
  • Clear LongName after use to prevent stale data leaking to next entry
  • Handle PAX extended header 'linkpath' key alongside existing 'path'
  • Remove TODO: GNUTYPE_LONGLINK comment

Fixes opening TAR archives containing hard links with paths > 100 chars.


TAR-архивы, содержащие жёсткие ссылки (hard links) с длиной пути цели более 100 символов, использует специальный блок GNUTYPE_LONGLINK ('K') для хранения полного пути. Ранее этот блок обрабатывался так же, как GNUTYPE_LONGNAME — данные записывались в общую переменную LongName и затем применялись к PathName вместо LinkName. В результате при попытке открыть такой архив в far2l возвращался GETARC_BROKEN.

Примечание: исправление относится к встроенному парсеру TAR в targz.cpp, который используется когда libarchive недоступна. При наличии libarchive far2l делегирует разбор TAR этой библиотеке, и данный код не задействуется.

Изменения:

  • Добавлена отдельная переменная LongLink для хранения данных GNUTYPE_LONGLINK
  • Записи GNUTYPE_LONGLINK теперь направляются в LongLink, а не в LongName
  • LongLink применяется к Info->LinkName при наличии данных
  • Исправлена утечка данных: LongName теперь очищается после использования, иначе устаревшие данные попадали в следующую запись
  • В обработке PAX extended header добавлена поддержка ключа 'linkpath' наряду с уже существующим 'path'
  • Удалён комментарий TODO: GNUTYPE_LONGLINK

Проверено: архивы с жёсткими ссылками с длиной пути более 100 символов теперь корректно открываются в far2l.

… paths

TAR archives with hard links whose target path exceeds 100 characters
use a GNUTYPE_LONGLINK ('K') header block to store the full link name.
Previously this data was incorrectly stored in LongName (shared with
GNUTYPE_LONGNAME) and then applied to PathName instead of LinkName,
causing far2l to return GETARC_BROKEN when browsing such archives.

Changes:
- Add separate LongLink vector to store GNUTYPE_LONGLINK data
- Route GNUTYPE_LONGLINK records into LongLink instead of LongName
- Apply LongLink to Info->LinkName when present
- Clear LongName after use to prevent stale data leaking to next entry
- Handle PAX extended header 'linkpath' key alongside existing 'path'
- Remove TODO: GNUTYPE_LONGLINK comment

Fixes opening TAR archives containing hard links with paths > 100 chars.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant