Relax the check on 0 length streams.
authorLei Zhang <thestig@chromium.org>
Thu, 8 Oct 2015 17:34:28 +0000 (10:34 -0700)
committerLei Zhang <thestig@chromium.org>
Thu, 8 Oct 2015 17:34:28 +0000 (10:34 -0700)
CPDF_SyntaxParser::ReadStream() originally created stream objects when
the length is 0. Commit 2526930 tightened the constraint and returned
NULL. This has some adverse affects, as seen in Chromium's print
preview of PDFs.

Instead, relax the constraint a little so when the length is 0, return a
CPDF_Stream with NULL data and size 0.

BUG=531835

Review URL: https://codereview.chromium.org/1394743002 .

core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp

index 984e08d..a94e5bb 100644 (file)
@@ -2521,28 +2521,31 @@ CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict,
           len -= 1;
         }
       }
-      if (len <= 0) {
+      if (len < 0) {
         return nullptr;
       }
       pDict->SetAtInteger(FX_BSTRC("Length"), len);
     }
     m_Pos = streamStartPos;
   }
-  if (len <= 0) {
+  if (len < 0) {
     return nullptr;
   }
-  uint8_t* pData = FX_Alloc(uint8_t, len);
-  ReadBlock(pData, len);
-  if (pCryptoHandler) {
-    CFX_BinaryBuf dest_buf;
-    dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len));
-    void* context = pCryptoHandler->DecryptStart(objnum, gennum);
-    pCryptoHandler->DecryptStream(context, pData, len, dest_buf);
-    pCryptoHandler->DecryptFinish(context, dest_buf);
-    FX_Free(pData);
-    pData = dest_buf.GetBuffer();
-    len = dest_buf.GetSize();
-    dest_buf.DetachBuffer();
+  uint8_t* pData = nullptr;
+  if (len > 0) {
+    pData = FX_Alloc(uint8_t, len);
+    ReadBlock(pData, len);
+    if (pCryptoHandler) {
+      CFX_BinaryBuf dest_buf;
+      dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len));
+      void* context = pCryptoHandler->DecryptStart(objnum, gennum);
+      pCryptoHandler->DecryptStream(context, pData, len, dest_buf);
+      pCryptoHandler->DecryptFinish(context, dest_buf);
+      FX_Free(pData);
+      pData = dest_buf.GetBuffer();
+      len = dest_buf.GetSize();
+      dest_buf.DetachBuffer();
+    }
   }
   CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict);
   if (pContext) {