Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Unified Diff: core/fpdfapi/render/fpdf_render_loadimage.cpp

Issue 2486123002: Relax colorspace checks in CPDF_DIBSource::CreateDecoder(). (Closed)
Patch Set: Handle else case like before Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « core/fpdfapi/page/fpdf_page_colors.cpp ('k') | core/fxcodec/fx_codec.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: core/fpdfapi/render/fpdf_render_loadimage.cpp
diff --git a/core/fpdfapi/render/fpdf_render_loadimage.cpp b/core/fpdfapi/render/fpdf_render_loadimage.cpp
index c3fe99018c575e577f70044a1460f517b6bc18fe..f5a101e186edf55f03410103cda361c721b711c3 100644
--- a/core/fpdfapi/render/fpdf_render_loadimage.cpp
+++ b/core/fpdfapi/render/fpdf_render_loadimage.cpp
@@ -58,6 +58,10 @@ bool IsAllowedBPCValue(int bpc) {
return bpc == 1 || bpc == 2 || bpc == 4 || bpc == 8 || bpc == 16;
}
+bool IsAllowedICCComponents(int nComp) {
+ return nComp == 1 || nComp == 3 || nComp == 4;
+}
+
template <typename T>
T ClampValue(T value, T max_value) {
value = std::min(value, max_value);
@@ -545,9 +549,34 @@ int CPDF_DIBSource::CreateDecoder() {
const uint8_t* src_data = m_pStreamAcc->GetData();
Tom Sepez 2016/11/09 17:26:37 nit: can these move down some?
Lei Zhang 2016/11/09 22:23:49 Done.
uint32_t src_size = m_pStreamAcc->GetSize();
const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam();
+ if (decoder == "JPXDecode") {
+ LoadJpxBitmap();
+ return m_pCachedBitmap ? 1 : 0;
+ }
+ if (decoder == "JBIG2Decode") {
+ m_pCachedBitmap = pdfium::MakeUnique<CFX_DIBitmap>();
+ if (!m_pCachedBitmap->Create(
+ m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {
+ m_pCachedBitmap.reset();
+ return 0;
+ }
+ m_Status = 1;
+ return 2;
+ }
+
if (decoder == "CCITTFaxDecode") {
m_pDecoder.reset(FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width,
m_Height, pParams));
+ } else if (decoder == "FlateDecode") {
+ m_pDecoder.reset(FPDFAPI_CreateFlateDecoder(
+ src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams));
+ } else if (decoder == "RunLengthDecode") {
+ m_pDecoder.reset(CPDF_ModuleMgr::Get()
+ ->GetCodecModule()
+ ->GetBasicModule()
+ ->CreateRunLengthDecoder(src_data, src_size, m_Width,
+ m_Height, m_nComponents,
+ m_bpc));
} else if (decoder == "DCTDecode") {
m_pDecoder.reset(CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(
src_data, src_size, m_Width, m_Height, m_nComponents,
@@ -563,12 +592,41 @@ int CPDF_DIBSource::CreateDecoder() {
FX_Free(m_pCompData);
m_pCompData = nullptr;
m_nComponents = static_cast<uint32_t>(comps);
- if (m_pColorSpace &&
- m_pColorSpace->CountComponents() != m_nComponents) {
- return 0;
+ if (m_pColorSpace) {
+ switch (m_Family) {
Tom Sepez 2016/11/09 17:26:37 Do we want to bound the components here to the exp
Lei Zhang 2016/11/09 22:27:56 I don't know what is correct for all the cases. I'
+ case PDFCS_DEVICEGRAY:
+ case PDFCS_DEVICERGB:
+ case PDFCS_DEVICECMYK: {
+ uint32_t dwMinComps = ComponentsForFamily(m_Family);
+ if (m_pColorSpace->CountComponents() < dwMinComps ||
+ m_nComponents < dwMinComps) {
+ return 0;
+ }
+ break;
+ }
+ case PDFCS_LAB: {
+ if (m_nComponents != 3 || m_pColorSpace->CountComponents() < 3)
+ return 0;
+ break;
+ }
+ case PDFCS_ICCBASED: {
+ if (!IsAllowedICCComponents(m_nComponents) ||
+ !IsAllowedICCComponents(m_pColorSpace->CountComponents()) ||
+ m_pColorSpace->CountComponents() < m_nComponents) {
+ return 0;
+ }
+ break;
+ }
+ default: {
+ if (m_pColorSpace->CountComponents() != m_nComponents)
+ return 0;
+ break;
+ }
+ }
+ } else {
+ if (m_Family == PDFCS_LAB && m_nComponents != 3)
+ return 0;
}
- if (m_Family == PDFCS_LAB && m_nComponents != 3)
- return 0;
m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey);
if (!m_pCompData)
return 0;
@@ -578,28 +636,6 @@ int CPDF_DIBSource::CreateDecoder() {
src_data, src_size, m_Width, m_Height, m_nComponents, bTransform));
}
}
- } else if (decoder == "FlateDecode") {
- m_pDecoder.reset(FPDFAPI_CreateFlateDecoder(
- src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams));
- } else if (decoder == "JPXDecode") {
- LoadJpxBitmap();
- return m_pCachedBitmap ? 1 : 0;
- } else if (decoder == "JBIG2Decode") {
- m_pCachedBitmap.reset(new CFX_DIBitmap);
- if (!m_pCachedBitmap->Create(
- m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {
- m_pCachedBitmap.reset();
- return 0;
- }
- m_Status = 1;
- return 2;
- } else if (decoder == "RunLengthDecode") {
- m_pDecoder.reset(CPDF_ModuleMgr::Get()
- ->GetCodecModule()
- ->GetBasicModule()
- ->CreateRunLengthDecoder(src_data, src_size, m_Width,
- m_Height, m_nComponents,
- m_bpc));
}
if (!m_pDecoder)
return 0;
« no previous file with comments | « core/fpdfapi/page/fpdf_page_colors.cpp ('k') | core/fxcodec/fx_codec.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698