背景
PR #353 (#314 HTML export data URI 埋め込み) の codex-review security で MEDIUM/92 として surface した finding のうち、bounded concurrency (K=4) 導入で対処しきれなかった「エクスポート全体の埋め込みバイト数上限」を追跡する。
現状
src/lib/resolve-html-images.ts の embedHtmlImagesAsDataUri は EMBED_CONCURRENCY=4 でファイル読み込みを bound (main 側 Buffer.alloc の一時ピークは ~256MB に抑制)
- 個別ファイルの上限は main 側
readFileBase64Impl で MAX_READ_FILE_BYTES = 64MB として強制
- しかしエクスポート 全体 の埋め込み byte 合計に上限がなく、極端な文書 (例: 500 個の 63MB PNG を参照) で renderer が innerHTML string を組み立てる際に累積 30GB+ のメモリを踏み OOM リスクが残る
Failure scenario
Crafted markdown (or 極めて画像枚数の多い legitimate 文書) を HTML export した際に:
- 各画像は個別 64MB 以内で readFileBase64 に通る
- 並列度 4 で順次 read され、各成功で renderer 側の img.setAttribute で base64 文字列を保持
- N=500+ で累積 base64 文字列が V8 heap を圧迫 → renderer OOM crash
対応候補
- TOTAL_EMBED_BYTES_LIMIT (例: 256MB) を導入し、累積が超えたら残りの img を data URI 化せずスキップ (元 src を維持)
- あるいは HTML 出力後の総サイズを事前推定し、閾値超過を Save Dialog 前に user に確認する UI
- どちらも「上限に達したら壊れる」ではなく「壊さず graceful degradation」を目指す
参考
背景
PR #353 (#314 HTML export data URI 埋め込み) の codex-review security で MEDIUM/92 として surface した finding のうち、bounded concurrency (K=4) 導入で対処しきれなかった「エクスポート全体の埋め込みバイト数上限」を追跡する。
現状
src/lib/resolve-html-images.tsのembedHtmlImagesAsDataUriは EMBED_CONCURRENCY=4 でファイル読み込みを bound (main 側 Buffer.alloc の一時ピークは ~256MB に抑制)readFileBase64Implで MAX_READ_FILE_BYTES = 64MB として強制Failure scenario
Crafted markdown (or 極めて画像枚数の多い legitimate 文書) を HTML export した際に:
対応候補
参考