Validação de grafo de segmentos JBIG2

O HotPDF valida imagens JBIG2 embutidas e streams JBIG2Globals antes que um decodificador nativo ou externo os receba

O validador executa uma caminhada de segmentos com limite, seguida de uma travessia iterativa do grafo de dependências, usando busca indexada por número de segmento em vez de varreduras repetidas

Valide antes do processamento personalizado

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 relata contagens de segmentos e arestas, novos símbolos declarados, profundidade máxima de dependência e o stream, o deslocamento de byte, o número de segmento e o número de referência associados à primeira falha

Os orçamentos vivem em um registro TJBIG2SegmentGraphValidationOptions cujos campos MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth e MaxSymbols limitam cada caminhada

O estado terminal é um valor de TJBIG2SegmentGraphValidationStatus que vai de not-checked e valid até rejeição de opções, falhas de cabeçalho e de referência, ciclos e violações de dicionário de símbolos, e o HPDFJBIG2SegmentGraphValidationStatusName o renderiza como texto

FailureStreamKind usa TJBIG2SegmentStreamKind para dizer se a primeira falha foi encontrada no stream de globals (jbsskGlobals) ou no stream de imagem (jbsskImage)

THPDFJBIG2Decoder.LastSegmentGraphValidationInfo retém o mesmo relatório após LoadFromByteArray ou LoadRegionFromByteArray

Condições fail-closed

A validação rejeita cabeçalhos malformados ou truncados, cabeçalhos de arquivo standalone em streams embutidos, tabelas de referência curtas proibidas e longas excessivas, identificadores de segmento duplicados ou ausentes, dependências fisicamente para frente, ciclos de dependência, profundidade excessiva e estouro dos orçamentos de segmentos ou arestas configurados

Segmentos de imagem devem usar associação de página 1, segmentos globais devem usar associação de página 0, e um segmento global não pode depender de um segmento de imagem

Segmentos embutidos de fim de página, fim de arquivo e paleta de cores são rejeitados, assim como segmentos de região somente de página e de informação de página colocados em JBIG2Globals

Os cabeçalhos de dicionário de símbolos são inspecionados antes da decodificação, para que contagens declaradas de novos e exportados símbolos, pools agregados de símbolos de entrada e totais de exportação impossíveis falhem antes da alocação de bitmap

Fronteira entre decodificador e cache de globais

THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode e as chamadas embutidas de HPDFJBIG2DecDecodeEx compartilham a mesma política

Os backends nativo e externo registrados usam caminhos internos já validados, evitando uma caminhada duplicada do grafo na decodificação normal

THPDFJBIG2GlobalsPool.Register aceita apenas um stream de segmentos global válido, impedindo que dicionários compartilhados malformados entrem na reutilização em nível de documento

Arquivos JBIG2 standalone passados com Embedded = False mantêm seu caminho de decodificação separado orientado a arquivo

Veja JBIG2 compression support, THPDFJBIG2Decoder.LoadFromByteArray e THPDFJBIG2Decoder.LoadRegionFromByteArray