Skip to content

exportAsHtml: 埋め込み画像の累積バイト数に上限を設ける (renderer OOM 対策) #354

Description

@ymnao

背景

PR #353 (#314 HTML export data URI 埋め込み) の codex-review security で MEDIUM/92 として surface した finding のうち、bounded concurrency (K=4) 導入で対処しきれなかった「エクスポート全体の埋め込みバイト数上限」を追跡する。

現状

  • src/lib/resolve-html-images.tsembedHtmlImagesAsDataUri は 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 した際に:

  1. 各画像は個別 64MB 以内で readFileBase64 に通る
  2. 並列度 4 で順次 read され、各成功で renderer 側の img.setAttribute で base64 文字列を保持
  3. N=500+ で累積 base64 文字列が V8 heap を圧迫 → renderer OOM crash

対応候補

  • TOTAL_EMBED_BYTES_LIMIT (例: 256MB) を導入し、累積が超えたら残りの img を data URI 化せずスキップ (元 src を維持)
  • あるいは HTML 出力後の総サイズを事前推定し、閾値超過を Save Dialog 前に user に確認する UI
  • どちらも「上限に達したら壊れる」ではなく「壊さず graceful degradation」を目指す

参考

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions