説明
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でディスクリプターを閉じます。