Validazione del Grafo dei Segmenti JBIG2
HotPDF valida gli stream di immagini JBIG2 incorporati e i JBIG2Globals prima che un decoder nativo o esterno li riceva
Il validatore esegue un'unica traversata limitata dei segmenti seguita da una traversata iterativa del grafo delle dipendenze, usando la ricerca dei numeri di segmento per indice invece di scansioni ripetute
Validare prima dell'elaborazione personalizzata
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 riporta conteggi di segmenti ed edge, nuovi simboli dichiarati, profondità massima delle dipendenze, e lo stream, l'offset in byte, il numero di segmento e il numero di riferimento associati al primo fallimento
I budget vivono in un record TJBIG2SegmentGraphValidationOptions i cui campi MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth e MaxSymbols limitano ogni traversata
Lo stato terminale è un valore TJBIG2SegmentGraphValidationStatus che va da not-checked e valid fino a rifiuto delle opzioni, guasti di header e riferimenti, cicli e violazioni dei symbol dictionary, e HPDFJBIG2SegmentGraphValidationStatusName lo rende come testo
FailureStreamKind usa TJBIG2SegmentStreamKind per dire se il primo fallimento è stato trovato nello stream dei globals (jbsskGlobals) o nello stream dell'immagine (jbsskImage)
THPDFJBIG2Decoder.LastSegmentGraphValidationInfo conserva lo stesso rapporto dopo LoadFromByteArray o LoadRegionFromByteArray
Condizioni di fail-closed
La validazione rifiuta header malformati o troncati, file header isolati negli stream incorporati, tabelle di riferimento corte vietate e lunghe oversize, identificatori di segmento duplicati o mancanti, dipendenze fisicamente in avanti, cicli di dipendenza, profondità eccessiva e superamento dei budget configurati per segmenti o edge
I segmenti immagine devono usare l'associazione di pagina 1, i segmenti globali devono usare l'associazione di pagina 0, e un segmento globale non può dipendere da un segmento immagine
I segmenti end-of-page, end-of-file e color-palette incorporati vengono rifiutati, così come i segmenti region e page-information riservati alle pagine inseriti in JBIG2Globals
Gli header dei symbol dictionary vengono esaminati prima del decoding, così che i conteggi dichiarati di simboli nuovi ed esportati, i pool di simboli di input aggregati e i totali di esportazione impossibili falliscano prima dell'allocazione delle bitmap
Confine tra decoder e cache dei globals
THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode e le chiamate incorporate a HPDFJBIG2DecDecodeEx condividono la stessa politica
I backend nativi ed esterni registrati usano percorsi interni già validati, evitando una traversata duplicata del grafo durante il decoding normale
THPDFJBIG2GlobalsPool.Register accetta solo uno stream di segmenti globali valido, impedendo ai dizionari condivisi malformati di entrare nel riuso a livello di documento
I file JBIG2 standalone passati con Embedded = False conservano il loro separato percorso di decoding orientato ai file
Vedere supporto alla compressione JBIG2, THPDFJBIG2Decoder.LoadFromByteArray e THPDFJBIG2Decoder.LoadRegionFromByteArray