Walidacja grafu segmentów JBIG2
HotPDF waliduje osadzone strumienie obrazów JBIG2 i JBIG2Globals, zanim trafią one do dekodera natywnego lub zewnętrznego
Walidator wykonuje jeden ograniczony obchód segmentów, a po nim iteracyjne przejście po grafie zależności, korzystając z indeksowanego wyszukiwania numerów segmentów zamiast powtarzanych skanów
Walidacja przed własnym przetwarzaniem
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 raportuje liczby segmentów i krawędzi, zadeklarowane nowe symbole, maksymalną głębokość zależności oraz strumień, offset bajtu, numer segmentu i numer referencji powiązane z pierwszą awarią
Budżety mieszczą się w rekordzie TJBIG2SegmentGraphValidationOptions, którego pola MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth i MaxSymbols ograniczają każdy obchód
Stanem końcowym jest wartość TJBIG2SegmentGraphValidationStatus — od stanu niesprawdzonego i poprawnego aż po odrzucenie opcji, awarie nagłówka i referencji, cykle oraz naruszenia słownika symboli — a HPDFJBIG2SegmentGraphValidationStatusName renderuje ją jako tekst
FailureStreamKind używa typu TJBIG2SegmentStreamKind, aby powiedzieć, czy pierwsza awaria została znaleziona w strumieniu globals (jbsskGlobals), czy w strumieniu obrazu (jbsskImage)
THPDFJBIG2Decoder.LastSegmentGraphValidationInfo przechowuje ten sam raport po LoadFromByteArray lub LoadRegionFromByteArray
Warunki fail-closed
Walidacja odrzuca źle uformowane lub ucięte nagłówki, samodzielne nagłówki plików w strumieniach osadzonych, zakazane krótkie i przewymiarowane długie tablice referencji, zduplikowane albo brakujące identyfikatory segmentów, zależności fizycznie skierowane w przód, cykle zależności, nadmierną głębokość oraz przekroczenia skonfigurowanych budżetów segmentów i krawędzi
Segmenty obrazów muszą używać asocjacji strony 1, segmenty globalne asocjacji strony 0, a segment globalny nie może zależeć od segmentu obrazu
Osadzone segmenty end-of-page, end-of-file i palety kolorów są odrzucane, podobnie jak segmenty regionu i informacji o stronie przeznaczone wyłącznie dla strony, umieszczone w JBIG2Globals
Nagłówki słowników symboli są badane przed dekodowaniem, dzięki czemu zadeklarowane liczby nowych i eksportowanych symboli, zagregowane pule symboli wejściowych i niemożliwe sumy eksportu zawodzą przed alokacją bitmap
Granica dekodera i pamięci podręcznej globals
THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode i osadzone wywołania HPDFJBIG2DecDecodeEx dzielą tę samą politykę
Zarejestrowane backendy natywne i zewnętrzne korzystają z już zwalidowanych ścieżek wewnętrznych, unikając podwójnego obchodu grafu przy normalnym dekodowaniu
THPDFJBIG2GlobalsPool.Register przyjmuje wyłącznie poprawny strumień segmentów wyłącznie globalnych, co blokuje wejście wadliwych słowników współdzielonych do ponownego użycia na poziomie dokumentu
Samodzielne pliki JBIG2 przekazane z Embedded = False zachowują swoją odrębną, zorientowaną na plik ścieżkę dekodowania
Zobacz obsługę kompresji JBIG2, THPDFJBIG2Decoder.LoadFromByteArray i THPDFJBIG2Decoder.LoadRegionFromByteArray