JBIG2 세그먼트 그래프 검증
HotPDF는 네이티브 또는 외부 디코더에 전달하기 전에 내장 JBIG2 이미지와 JBIG2Globals 스트림을 검증합니다
검증기는 반복 스캔 대신 인덱스 기반 세그먼트 번호 조회를 쓰면서 하나의 제한된 세그먼트 순회에 이어 반복적인 의존성 그래프 탐색을 수행합니다
사용자 정의 처리 전 검증
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는 세그먼트 및 엣지 수, 선언된 새 심볼, 최대 의존성 깊이, 그리고 첫 실패와 관련된 스트림, 바이트 오프셋, 세그먼트 번호, 참조 번호를 보고합니다
예산은 TJBIG2SegmentGraphValidationOptions 레코드에 담기며, 이 레코드의 MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth, MaxSymbols 필드가 모든 순회에 상한을 둡니다
최종 상태는 TJBIG2SegmentGraphValidationStatus 값으로, 미검사와 유효부터 옵션 거부, 헤더·참조 실패, 순환, 심볼 사전 위반까지를 포괄하며, HPDFJBIG2SegmentGraphValidationStatusName이 이를 텍스트로 렌더링합니다
FailureStreamKind는 TJBIG2SegmentStreamKind를 통해 첫 실패가 globals 스트림(jbsskGlobals)에서 발견됐는지 이미지 스트림(jbsskImage)에서 발견됐는지를 알려 줍니다
THPDFJBIG2Decoder.LastSegmentGraphValidationInfo는 LoadFromByteArray 또는 LoadRegionFromByteArray 후에 같은 보고서를 유지합니다
fail-closed 조건
검증은 malformed이거나 잘린 헤더, 내장 스트림 안의 독립 파일 헤더, 금지된 짧은 참조 테이블과 과도하게 긴 long 참조 테이블, 중복되거나 없는 세그먼트 식별자, 물리적으로 앞서 가는 의존성, 의존성 순환, 과도한 깊이, 설정된 세그먼트 또는 엣지 예산 초과를 거부합니다
이미지 세그먼트는 페이지 연관 1을, 전역 세그먼트는 페이지 연관 0을 사용해야 하고, 전역 세그먼트는 이미지 세그먼트에 의존할 수 없습니다
내장된 end-of-page, end-of-file, 색상 팔레트 세그먼트는 거부되며, JBIG2Globals에 들어간 page 전용 region 및 page-information 세그먼트도 거부됩니다
심볼 사전 헤더는 디코딩 전에 검사되므로 선언된 새 심볼 및 내보낸 심볼 수, 집계 입력 심볼 풀, 불가능한 내보내기 총계는 비트맵 할당 전에 실패합니다
디코더 및 globals 캐시 경계
THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode, 내장 HPDFJBIG2DecDecodeEx 호출은 같은 정책을 공유합니다
등록된 네이티브 및 외부 백엔드는 이미 검증된 내부 경로를 사용하므로 평범한 디코딩에서 그래프 순회가 중복되지 않습니다
THPDFJBIG2GlobalsPool.Register는 유효한 global-only 세그먼트 스트림만 받아서 malformed 공유 사전이 문서 수준 재사용에 들어가지 못하게 합니다
Embedded = False로 넘긴 독립 JBIG2 파일은 별도의 파일 지향 디코딩 경로를 유지합니다
JBIG2 압축 지원, THPDFJBIG2Decoder.LoadFromByteArray, THPDFJBIG2Decoder.LoadRegionFromByteArray를 참고하세요