Ověření segmentového grafu JBIG2
HotPDF ověřuje vložené obrázky JBIG2 a streamy JBIG2Globals dříve, než je obdrží nativní či externí dekodér
Validator provede jeden ohraničený průchod segmenty s následným iterativním průchodem grafem závislostí s použitím indexovaného vyhledávání podle čísla segmentu namísto opakovaných skenů
Ověření před vlastním zpracováním
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 hlásí počty segmentů a hran, deklarované nové symboly, maximální hloubku závislostí a stream, bajtový offset, číslo segmentu a číslo reference spojené s prvním selháním
Rozpočty sídlí v záznamu TJBIG2SegmentGraphValidationOptions, jehož pole MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth a MaxSymbols ohraničují každý průchod
Koncový stav je hodnota TJBIG2SegmentGraphValidationStatus od nezkontrolováno a platné přes odmítnutí voleb, selhání hlavičky a referencí, cykly až po porušení slovníku symbolů; HPDFJBIG2SegmentGraphValidationStatusName ji převede na text
FailureStreamKind prostřednictvím typu TJBIG2SegmentStreamKind říká, zda bylo první selhání nalezeno v streamu globals (jbsskGlobals) nebo v obrazovém streamu (jbsskImage)
THPDFJBIG2Decoder.LastSegmentGraphValidationInfo uchovává stejnou zprávu po LoadFromByteArray nebo LoadRegionFromByteArray
Podmínky selhání
Ověření odmítá poškozené či zkrácené hlavičky, hlavičky samostatných souborů ve vložených streamech, zakázané krátké a příliš velké dlouhé referenční tabulky, duplicitní či chybějící identifikátory segmentů, fyzicky dopředné závislosti, cykly závislostí, nadměrnou hloubku a přetečení nakonfigurovaného rozpočtu segmentů nebo hran
Obrazové segmenty musí používat asociaci stránek 1, globální segmenty asociaci stránek 0 a globální segment nesmí záviset na obrazovém segmentu
Vložené segmenty konce stránky, konce souboru a palety barev jsou odmítnuty, stejně jako segmenty regionu a informací stránky určené pouze pro stránky umístěné v JBIG2Globals
Hlavičky slovníků symbolů se kontrolují před dekódováním, takže deklarované nové a exportované počty symbolů, agregované vstupní skupiny symbolů a nemožné součty exportů selžou dříve než alokace bitmapy
Hranice dekodéru a cache globals
THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode a vložená volání HPDFJBIG2DecDecodeEx sdílejí stejnou politiku
Registrované nativní a externí backends používají již ověřené interní cesty, čímž se při běžném dekódování vyhnou duplicitnímu průchodu grafem
THPDFJBIG2GlobalsPool.Register přijímá pouze platný stream globálních segmentů, čímž zabraňuje vniknutí poškozených sdílených slovníků do znovupoužití na úrovni dokumentu
Samostatné soubory JBIG2 předané s Embedded = False zachovávají svou oddělenou cestu dekódování orientovanou na soubory
Viz podpora komprese JBIG2, THPDFJBIG2Decoder.LoadFromByteArray a THPDFJBIG2Decoder.LoadRegionFromByteArray