Skip to content

fix: 不正なテーブルのマークアップでのクラッシュとハングを修正 - #370

Merged
ymrl merged 1 commit into
mainfrom
fix/table-parse-invalid-values
Jul 31, 2026
Merged

fix: 不正なテーブルのマークアップでのクラッシュとハングを修正#370
ymrl merged 1 commit into
mainfrom
fix/table-parse-invalid-values

Conversation

@ymrl

@ymrl ymrl commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Table の解析でクラッシュする事象の調査から始めて、同じ系統の問題をまとめて修正しました。

修正内容

1. 行のないテーブルでのクラッシュ

cells[cells.length - 1].reduce(...) が、行のないテーブルで undefined.reduce になっていました。

あわせて rowCountcolCount と同じく全行から求める形に揃えています。これにより、以下も直ります。

  • 末尾に <tr></tr> があるテーブルで rowCount が 0 になっていた(クラッシュしないぶん気づきにくい不具合)
  • 最終行を越える rowspan が行数に反映されていなかった(HTML のテーブルモデルではテーブル高さが広がる)

2. Array(NaN) / Array(負数) による RangeError

getRowHeaderElements / getColHeaderElementsArray(sizeY) Array(positionX)RangeError: Invalid array length を投げていました。実際に再現を確認したもの:

マークアップ 結果
rowspan="abc" sizeY: NaN → RangeError
rowspan="-5" sizeY: -5 → RangeError
aria-colindex="abc" positionX: NaN, colCount: NaN → RangeError

不正な属性値は実際の Web ページに珍しくないため、報告されたクラッシュはこちらの可能性が高いと考えています。

3. aria-rowspan に上限がなくページがハングする

native の rowspan は 65534 に丸めていましたが、aria-* は素通しでした。aria-rowspan="99999999"getRowHeaderElements約6〜7秒ブロックすることを確認しています。コンテンツスクリプトなのでページが固まります。

4. getCell が型に反して undefined を返す

return cell ? cell[0] : null は配列が常に truthy なので分岐が機能しておらず、シグネチャ Cell | null に反して undefined を返していました。呼び出し元は if (cell) の truthiness 判定なので顕在化していませんでしたが、潜在バグとして修正しています。

方針

Array() 呼び出しを個別に守るのではなく、属性値のパースを入口で正規化する形にしました。

  • parseSpanAttribute — 解釈不能・負値は HTML 仕様の既定値 1 に。aria-* にも native と同じ上限を適用
  • parseIndexAttribute — 1始まりの整数でなければ属性なし扱いにフォールバック(不正な aria-colindex が rowspan 回避ループもスキップさせていた点もあわせて解消)

挙動変更の注意点

aria-colspan / aria-rowspan に上限(1000 / 65534)を新設しています。実用上ありえない値の域ですが、意図的な変更です。

なお rowspan="0" は仕様上有効な値のため今回は既存挙動のまま触っていません(現状 0 スロット扱いでヘッダー紐付けから外れる別の問題が残っています)。

テスト

テスト8件を追加し、packages/table 86件、全パッケージ(rules 1131件・browser_extension 526件ほか)、pnpm lint-fixtsc --noEmit がすべて通っています。

🤖 Generated with Claude Code

- 行のないテーブルや、セルのない行だけのテーブルで解析時に例外が出ていた
- rowspan/colspan/aria-rowspan/aria-colspanの不正な値がNaNや負数のまま
  セルのサイズになり、ヘッダー探索のArray(size)がRangeErrorを投げていた
- aria-rowindex/aria-colindexの不正な値が座標をNaNにしていた
- aria-rowspan/aria-colspanに上限がなく、極端な値でヘッダー探索が
  数秒間ブロックしていた
- rowCountを全行から求めるようにし、末尾のセルのない行や最終行を
  越えるrowspanを正しく扱うようにした

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ymrl
ymrl merged commit d06312e into main Jul 31, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant