JBIG2 Segment-Graph Validation

HotPDF は、ネイティブまたは外部のデコーダが受け取る前に、埋め込まれた JBIG2 画像ストリームと JBIG2Globals ストリームを検証します

バリデータは、反復的な走査の代わりにインデックス化されたセグメント番号ルックアップを使い、1 回の有界なセグメント走査と、それに続く反復的な依存関係グラフの走査を実行します

Validate before custom processing

Options := DefaultJBIG2SegmentGraphValidationOptions;
Options.MaxSegments := 32768;
Options.MaxTotalReferences := 131072;
Options.MaxReferenceDepth := 512;
Options.MaxSymbols := 500000;

if not HPDFValidateJBIG2SegmentGraph(ImageData, GlobalData,
  Options, Info) then
  raise Exception.Create(string(
    HPDFJBIG2SegmentGraphValidationStatusName(Info.Status)));

TJBIG2SegmentGraphValidationInfo は、セグメント数とエッジ数、宣言された新規シンボル、最大依存深度、および最初の失敗に関連するストリーム・バイトオフセット・セグメント番号・参照番号を報告します

予算は TJBIG2SegmentGraphValidationOptions レコードに定義されており、MaxSegments、MaxReferencesPerSegment、MaxTotalReferences、MaxReferenceDepth、MaxSymbols の各フィールドがすべての走査に上限を課します

終端状態は TJBIG2SegmentGraphValidationStatus 値で、未検証と有効から始まり、オプションの拒否、ヘッダーと参照の失敗、サイクル、シンボル辞書違反までを網羅します。HPDFJBIG2SegmentGraphValidationStatusName がこの状態をテキスト化します

FailureStreamKind は TJBIG2SegmentStreamKind によって、最初の失敗が globals ストリーム(jbsskGlobals)と画像ストリーム(jbsskImage)のどちらで見つかったかを示します

THPDFJBIG2Decoder.LastSegmentGraphValidationInfo は、LoadFromByteArray または LoadRegionFromByteArray の後に同じレポートを保持します

Fail-closed conditions

検証は、形式が壊れたまたは切り詰められたヘッダ、埋め込みストリーム内のスタンドアロンファイルヘッダ、許可されない短い参照テーブルと過大な長い参照テーブル、重複または欠落したセグメント識別子、物理的な前方依存、依存サイクル、過度の深度、設定されたセグメントまたはエッジ予算の超過を拒否します

画像セグメントはページ関連付け 1 を、グローバルセグメントはページ関連付け 0 を使わなければならず、グローバルセグメントが画像セグメントに依存することはできません

埋め込まれたページ終端・ファイル終端・カラーパレットの各セグメントは、JBIG2Globals に置かれたページ専用の領域セグメントやページ情報セグメントと同様に拒否されます

シンボル辞書ヘッダはデコード前に検査されるため、宣言された新規およびエクスポートシンボル数、集計入力シンボルプール、不可能なエクスポート総数をビットマップ割り当て前に失敗させます

Decoder and globals-cache boundary

THPDFJBIG2Decoder、HPDFJBIG2NativeMMRDecode、HPDFJBIG2NativeRegionDecode、および埋め込まれた HPDFJBIG2DecDecodeEx の呼び出しは同じポリシーを共有します

登録されたネイティブおよび外部バックエンドはすでに検証済みの内部経路を使うため、通常のデコード時にグラフ走査を二重に行いません

THPDFJBIG2GlobalsPool.Register は有効なグローバルのみのセグメントストリームだけを受け入れるため、形式の壊れた共有辞書がドキュメントレベルの再利用に入り込むのを防ぎます

Embedded = False で渡されたスタンドアロン JBIG2 ファイルは、別のファイル指向デコード経路を保持します

JBIG2 compression support、THPDFJBIG2Decoder.LoadFromByteArray、THPDFJBIG2Decoder.LoadRegionFromByteArray を参照してください