ファイルリソースが確実に解放されない

ファイルリソースが確実に解放されない

説明

fs.openSync() や fs.promises.open() で取得したファイルリソースを、確実な close() 呼び出しなしで使うと、正常に戻る場合も例外が発生する場合も、ファイルディスクリプターが開いたまま残る可能性があります。

想定される影響

  • リクエストの繰り返しでディスクリプターのリークが蓄積し、サービス拒否につながるおそれがあります。
  • ファイルロックやリソースの枯渇で、正常なリクエストが失敗する可能性があります。

対処方法

  • ファイルハンドルは try/finally で確実に閉じてください。
  • 可能なら、リソースの寿命が明確な高水準のファイルAPIを使ってください。

例

fs と path が用意された関数内の抜粋です。

変更前

javascript
const fd = fs.openSync(path, "r");
return fs.readFileSync(fd);

変更後

javascript
const fd = fs.openSync(path, "r");
try {
  return fs.readFileSync(fd);
} finally {
  fs.closeSync(fd);
}

解説:

  • 変更前: 確実なクローズ処理がないため、読み取りの完了後や例外発生後もディスクリプターが開いたまま残る可能性があります。
  • 変更後: 読み取りが成功した場合も例外が発生した場合も、finally でディスクリプターを閉じます。

参考資料