JBIG2-Segmentgraph-Validierung
HotPDF validiert eingebettete JBIG2-Bild- und JBIG2Globals-Ströme, bevor ein nativer oder externer Dekoder sie erhält
Der Validator führt einen begrenzten Segmentdurchlauf gefolgt von einer iterativen Traversierung des Abhängigkeitsgraphen aus und verwendet eine indizierte Segmentnummern-Suche statt wiederholter Scans
Vor benutzerdefinierter Verarbeitung validieren
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 meldet Segment- und Kantenzahlen, deklarierte neue Symbole, die maximale Abhängigkeitstiefe sowie den Strom, Byte-Offset, die Segmentnummer und die Referenznummer, die mit dem ersten Fehler verknüpft sind
Die Budgets leben in einem TJBIG2SegmentGraphValidationOptions-Record, dessen Felder MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth und MaxSymbols jeden Durchlauf begrenzen
Der Endzustand ist ein TJBIG2SegmentGraphValidationStatus-Wert von nicht geprüft und gültig über zurückgewiesene Optionen, Header- und Referenzfehler, Zyklen und Symbolwörterbuch-Verletzungen, und HPDFJBIG2SegmentGraphValidationStatusName gibt ihn als Text wieder
FailureStreamKind verwendet TJBIG2SegmentStreamKind, um zu sagen, ob der erste Fehler im Globals-Strom (jbsskGlobals) oder im Bildstrom (jbsskImage) gefunden wurde
THPDFJBIG2Decoder.LastSegmentGraphValidationInfo behält denselben Bericht nach LoadFromByteArray oder LoadRegionFromByteArray
Fail-Closed-Bedingungen
Die Validierung lehnt fehlerhafte oder abgeschnittene Header, eigenständige Datei-Header in eingebetteten Strömen, verbotene lange Referenztabellen in kleiner und überschrittener Größe, doppelte oder fehlende Segmentkennungen, physisch vorwärtsgerichtete Abhängigkeiten, Abhängigkeitszyklen, übermäßige Tiefe und konfigurierte Budgetüberschreitungen bei Segmenten oder Kanten ab
Bildsegmente müssen Seitenassoziation 1 verwenden, globale Segmente müssen Seitenassoziation 0 verwenden, und ein globales Segment darf nicht von einem Bildsegment abhängen
Eingebettete Seitenende-, Dateiende- und Farbpalettensegmente werden abgelehnt, ebenso wie nur-seitenbezogene Regions- und Seiteninformationssegmente, die in JBIG2Globals platziert sind
Symbolwörterbuch-Header werden vor der Dekodierung geprüft, sodass deklarierte neue und exportierte Symbolanzahlen, Aggregateingabesymbolpools und unmögliche Exportsummen vor der Bitmap-Allokation fehlschlagen
Grenze von Dekoder und Globals-Cache
THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode und eingebettete HPDFJBIG2DecDecodeEx-Aufrufe teilen dieselbe Policy
Die registrierten nativen und externen Backends verwenden bereits validierte interne Pfade, wodurch ein doppelter Graphdurchlauf bei normalem Dekodieren vermieden wird
THPDFJBIG2GlobalsPool.Register akzeptiert nur einen gültigen rein globalen Segmentstrom und verhindert, dass fehlerhafte gemeinsame Wörterbücher in die Wiederverwendung auf Dokumentebene gelangen
Eigenständige JBIG2-Dateien, die mit Embedded = False übergeben werden, behalten ihren separaten dateiorientierten Dekodierungspfad
Siehe JBIG2-Kompressions-Support, THPDFJBIG2Decoder.LoadFromByteArray und THPDFJBIG2Decoder.LoadRegionFromByteArray