Index: core/fpdfapi/fpdf_page/cpdf_meshstream.cpp |
diff --git a/core/fpdfapi/fpdf_page/cpdf_meshstream.cpp b/core/fpdfapi/fpdf_page/cpdf_meshstream.cpp |
index 491a48052ab09dd8e34562ff372eaf627de31991..de355418393855734a38278d196f6f53320b8c42 100644 |
--- a/core/fpdfapi/fpdf_page/cpdf_meshstream.cpp |
+++ b/core/fpdfapi/fpdf_page/cpdf_meshstream.cpp |
@@ -10,6 +10,42 @@ |
#include "core/fpdfapi/fpdf_page/pageint.h" |
#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
+namespace { |
+ |
+// See PDF Reference 1.7, page 315, table 4.32. (Also table 4.33 and 4.34) |
+bool IsValidBitsPerComponent(uint32_t x) { |
+ switch (x) { |
+ case 1: |
+ case 2: |
+ case 4: |
+ case 8: |
+ case 12: |
+ case 16: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+// Same references as IsValidBitsPerComponent() above. |
+bool IsValidBitsPerCoordinate(uint32_t x) { |
+ switch (x) { |
+ case 1: |
+ case 2: |
+ case 4: |
+ case 8: |
+ case 12: |
+ case 16: |
+ case 24: |
+ case 32: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+} // namespace |
+ |
CPDF_MeshStream::CPDF_MeshStream( |
const std::vector<std::unique_ptr<CPDF_Function>>& funcs, |
CPDF_ColorSpace* pCS) |
@@ -20,21 +56,24 @@ bool CPDF_MeshStream::Load(CPDF_Stream* pShadingStream) { |
m_BitStream.Init(m_Stream.GetData(), m_Stream.GetSize()); |
CPDF_Dictionary* pDict = pShadingStream->GetDict(); |
m_nCoordBits = pDict->GetIntegerBy("BitsPerCoordinate"); |
+ if (!IsValidBitsPerCoordinate(m_nCoordBits)) |
+ return false; |
+ |
m_nCompBits = pDict->GetIntegerBy("BitsPerComponent"); |
- m_nFlagBits = pDict->GetIntegerBy("BitsPerFlag"); |
- if (!m_nCoordBits || !m_nCompBits) |
- return FALSE; |
+ if (!IsValidBitsPerComponent(m_nCompBits)) |
+ return false; |
+ m_nFlagBits = pDict->GetIntegerBy("BitsPerFlag"); |
uint32_t nComps = m_pCS->CountComponents(); |
if (nComps > 8) |
- return FALSE; |
+ return false; |
m_nComps = m_funcs.empty() ? nComps : 1; |
m_CoordMax = m_nCoordBits == 32 ? -1 : (1 << m_nCoordBits) - 1; |
m_CompMax = (1 << m_nCompBits) - 1; |
CPDF_Array* pDecode = pDict->GetArrayBy("Decode"); |
if (!pDecode || pDecode->GetCount() != 4 + m_nComps * 2) |
- return FALSE; |
+ return false; |
m_xmin = pDecode->GetNumberAt(0); |
m_xmax = pDecode->GetNumberAt(1); |
@@ -44,7 +83,7 @@ bool CPDF_MeshStream::Load(CPDF_Stream* pShadingStream) { |
m_ColorMin[i] = pDecode->GetNumberAt(i * 2 + 4); |
m_ColorMax[i] = pDecode->GetNumberAt(i * 2 + 5); |
} |
- return TRUE; |
+ return true; |
} |
uint32_t CPDF_MeshStream::GetFlag() { |