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