JBIG2 Segment-Graph Validation

HotPDF xác thực các stream ảnh JBIG2 nhúng và các stream JBIG2Globals trước khi chúng đến tay một decoder thuần hoặc bên ngoài

Validator thực hiện một lượt đi segment có chặn trên, sau đó duyệt đồ thị phụ thuộc theo kiểu lặp, dùng bảng tra số segment theo chỉ mục thay vì quét lặp lại nhiều lần

Xác thực trước khi tự xử lý

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 báo cáo số đếm segment và cạnh, số symbol mới đã khai báo, độ sâu phụ thuộc tối đa, cùng stream, byte offset, số segment và số tham chiếu gắn với lỗi đầu tiên

Các ngân sách nằm trong bản ghi TJBIG2SegmentGraphValidationOptions, trong đó các trường MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth và MaxSymbols chặn trên mọi lượt đi

Trạng thái kết thúc là một giá trị TJBIG2SegmentGraphValidationStatus, từ not-checked và valid đến bị từ chối vì options, lỗi header và tham chiếu, chu trình, và vi phạm từ điển symbol; HPDFJBIG2SegmentGraphValidationStatusName hiển thị nó dưới dạng văn bản

FailureStreamKind dùng TJBIG2SegmentStreamKind để cho biết lỗi đầu tiên được tìm thấy trong globals stream (jbsskGlobals) hay image stream (jbsskImage)

THPDFJBIG2Decoder.LastSegmentGraphValidationInfo giữ lại cùng báo cáo sau LoadFromByteArray hoặc LoadRegionFromByteArray

Điều kiện fail-closed

Việc xác thực từ chối header dị dạng hoặc bị cắt cụt, file header standalone trong stream nhúng, bảng tham chiếu ngắn bị cấm và bảng dài quá khổ, số định dạng segment trùng hoặc thiếu, phụ thuộc vật lý về phía trước, chu trình phụ thuộc, độ sâu quá mức, và các trường hợp vượt ngân sách segment hoặc cạnh đã cấu hình

Segment ảnh phải dùng liên kết trang 1, segment global phải dùng liên kết trang 0, và một segment global không được phụ thuộc vào segment ảnh

Các segment end-of-page, end-of-file và bảng màu nhúng bị từ chối, tương tự các segment region và page-information chỉ dành cho trang đặt trong JBIG2Globals

Header của từ điển symbol được kiểm tra trước khi giải mã để số symbol mới và đã xuất đã khai báo, nhóm symbol đầu vào tổng hợp, và tổng số xuất bất khả thi đều thất bại trước khi cấp phát bitmap

Ranh giới decoder và globals cache

THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode và các lệnh gọi HPDFJBIG2DecDecodeEx nhúng chia sẻ cùng chính sách

Các backend thuần và bên ngoài đã đăng ký dùng các đường nội bộ đã được xác thực sẵn, tránh đi đồ thị trùng lặp trong giải mã bình thường

THPDFJBIG2GlobalsPool.Register chỉ chấp nhận stream segment global-only hợp lệ, ngăn từ điển dùng chung dị dạng lọt vào cơ chế tái sử dụng cấp tài liệu

Các file JBIG2 standalone truyền vào với Embedded = False vẫn giữ đường giải mã hướng file riêng

Xem hỗ trợ nén JBIG2, THPDFJBIG2Decoder.LoadFromByteArray và THPDFJBIG2Decoder.LoadRegionFromByteArray