Index: core/src/fxcodec/jbig2/JBig2_Context.cpp |
diff --git a/core/src/fxcodec/jbig2/JBig2_Context.cpp b/core/src/fxcodec/jbig2/JBig2_Context.cpp |
index f045dbb20dfc084033e43521356a8e931f551131..232bbf26af419d8d9db55a0a55433d697c8043b8 100644 |
--- a/core/src/fxcodec/jbig2/JBig2_Context.cpp |
+++ b/core/src/fxcodec/jbig2/JBig2_Context.cpp |
@@ -402,6 +402,7 @@ int32_t CJBig2_Context::parseSegmentHeader(CJBig2_Segment* pSegment) { |
failed: |
return JBIG2_ERROR_TOO_SHORT; |
} |
+ |
int32_t CJBig2_Context::parseSegmentData(CJBig2_Segment* pSegment, |
IFX_Pause* pPause) { |
int32_t ret = ProcessiveParseSegmentData(pSegment, pPause); |
@@ -411,6 +412,7 @@ int32_t CJBig2_Context::parseSegmentData(CJBig2_Segment* pSegment, |
} |
return ret; |
} |
+ |
int32_t CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment* pSegment, |
IFX_Pause* pPause) { |
switch (pSegment->m_cFlags.s.type) { |
@@ -419,37 +421,29 @@ int32_t CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment* pSegment, |
case 4: |
case 6: |
case 7: |
- if (m_nState == JBIG2_OUT_OF_PAGE) { |
- goto failed2; |
- } else { |
- return parseTextRegion(pSegment); |
- } |
+ if (m_nState == JBIG2_OUT_OF_PAGE) |
+ return JBIG2_ERROR_FATAL; |
+ return parseTextRegion(pSegment); |
case 16: |
return parsePatternDict(pSegment, pPause); |
case 20: |
case 22: |
case 23: |
- if (m_nState == JBIG2_OUT_OF_PAGE) { |
- goto failed2; |
- } else { |
- return parseHalftoneRegion(pSegment, pPause); |
- } |
+ if (m_nState == JBIG2_OUT_OF_PAGE) |
+ return JBIG2_ERROR_FATAL; |
+ return parseHalftoneRegion(pSegment, pPause); |
case 36: |
case 38: |
case 39: |
- if (m_nState == JBIG2_OUT_OF_PAGE) { |
- goto failed2; |
- } else { |
- return parseGenericRegion(pSegment, pPause); |
- } |
+ if (m_nState == JBIG2_OUT_OF_PAGE) |
+ return JBIG2_ERROR_FATAL; |
+ return parseGenericRegion(pSegment, pPause); |
case 40: |
case 42: |
case 43: |
- if (m_nState == JBIG2_OUT_OF_PAGE) { |
- goto failed2; |
- } else { |
- return parseGenericRefinementRegion(pSegment); |
- } |
+ if (m_nState == JBIG2_OUT_OF_PAGE) |
+ return JBIG2_ERROR_FATAL; |
+ return parseGenericRefinementRegion(pSegment); |
case 48: { |
FX_WORD wTemp; |
nonstd::unique_ptr<JBig2PageInfo> pPageInfo(new JBig2PageInfo); |
@@ -459,24 +453,26 @@ int32_t CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment* pSegment, |
(m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0) || |
(m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0) || |
(m_pStream->readShortInteger(&wTemp) != 0)) { |
- goto failed1; |
+ return JBIG2_ERROR_TOO_SHORT; |
} |
- pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? 1 : 0; |
+ pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? TRUE : FALSE; |
pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff; |
- if ((pPageInfo->m_dwHeight == 0xffffffff) && |
- (pPageInfo->m_bIsStriped != TRUE)) { |
+ bool bMaxHeight = (pPageInfo->m_dwHeight == 0xffffffff); |
+ if (bMaxHeight && pPageInfo->m_bIsStriped != TRUE) |
pPageInfo->m_bIsStriped = TRUE; |
- } |
+ |
if (!m_bBufSpecified) { |
delete m_pPage; |
- if (pPageInfo->m_dwHeight == 0xffffffff) { |
- m_pPage = new CJBig2_Image(pPageInfo->m_dwWidth, |
- pPageInfo->m_wMaxStripeSize); |
- } else { |
- m_pPage = |
- new CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_dwHeight); |
- } |
+ FX_DWORD height = |
+ bMaxHeight ? pPageInfo->m_wMaxStripeSize : pPageInfo->m_dwHeight; |
+ m_pPage = new CJBig2_Image(pPageInfo->m_dwWidth, height); |
+ } |
+ |
+ if (!m_pPage->m_pData) { |
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR; |
+ return JBIG2_ERROR_TOO_SHORT; |
} |
+ |
m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0); |
m_PageInfoList.push_back(pPageInfo.release()); |
m_nState = JBIG2_IN_PAGE; |
@@ -502,11 +498,8 @@ int32_t CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment* pSegment, |
break; |
} |
return JBIG2_SUCCESS; |
-failed1: |
- return JBIG2_ERROR_TOO_SHORT; |
-failed2: |
- return JBIG2_ERROR_FATAL; |
} |
+ |
int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment, |
IFX_Pause* pPause) { |
FX_DWORD dwTemp; |