Async x() never settles when a symlink linkpath resolves to a parent directory

オープン 初心者向け
#469 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

@nimbly1 がすでに取り組んでいます。

2026年10月26日 から。

  • #470 @nimbly1 による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
84/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
javascript, node.js
領域
backend

調査の方向性

src/path-reservations.tsから始めて、reserve()がパスをキューに入れる方法と、check()がそれらを解放する方法を追ってください。issueで説明されているアーカイブを使って再現し、linkpathが親ディレクトリに解決されるシンボリックリンクに対して、非同期のtar.xが完了することを検証するテストを追加してください。そのテストが成功し、パス予約の排他性が保たれれば完了です。

索引モデルが issue の本文から書いたものです。

説明

Version: [email protected]

Repro

const tar = require('tar')

// archive contains one entry:
// { path: 'a/b', type: 'SymbolicLink', linkpath: 'a' }

await tar.x({ cwd: dest, file })   // never resolves

Also reachable when a global PAX linkpath is applied to a plain File entry. With strip: 1 it still hangs. The sync tar.x path is unaffected.

Cause

PathReservations.reserve(['a/b', 'a']) enqueues [fn, Set{fn}] on the a queue while check() expects a leading Set (src/path-reservations.ts), so the reservation is never released and the promise never settles.

Fix

for (const p of paths) dirs.delete(p)

Exclusivity is preserved. A test asserting the promise settles would cover it.

Note

Distinct from #458 / #460, which are pack-side (Pack/create) deadlocks; this is the extract-side path.

主要言語
JavaScript
スター
923
フォーク
292
PR マージ指標
30日以内にマージされた PR はありません

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

isaacs/node-tar のほかの issue

isaacs/node-tar の issue をすべて見る

似ている issue

JavaScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。