summaryrefslogtreecommitdiff
path: root/core/fpdfapi/page/cpdf_streamcontentparser.h
diff options
context:
space:
mode:
authorRyan Harrison <rharrison@chromium.org>2017-08-31 11:57:14 -0400
committerChromium commit bot <commit-bot@chromium.org>2017-08-31 17:06:29 +0000
commitbc0ca1ec9b157ab8773c9043725c7422f7c1a57c (patch)
treec1e46db02a10e3377d597265dcf125b980c277b0 /core/fpdfapi/page/cpdf_streamcontentparser.h
parentdf064df7a08e008b3c8e4d56bb0b75da9f014147 (diff)
downloadpdfium-bc0ca1ec9b157ab8773c9043725c7422f7c1a57c.tar.xz
Prevent duplicate parses of same data, in the same recursive descent
When parsing if there is a loop in the data being parsed, the recursions will just keep cycling until it exhausts memory and crashes. This CL introduces a parsed set, which a reference to is passed down the descent. If the data being parsed at a specific stage of the descent is already in the parsed set, then the parse returns at that point. BUG=chromium:759224 Change-Id: I1dca73d81020099dec03fd49aaa44cdcdf38e17e Reviewed-on: https://pdfium-review.googlesource.com/12470 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Diffstat (limited to 'core/fpdfapi/page/cpdf_streamcontentparser.h')
-rw-r--r--core/fpdfapi/page/cpdf_streamcontentparser.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.h b/core/fpdfapi/page/cpdf_streamcontentparser.h
index 5cbe0ce734..a027129c31 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.h
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.h
@@ -9,6 +9,7 @@
#include <map>
#include <memory>
+#include <set>
#include <vector>
#include "core/fpdfapi/page/cpdf_contentmark.h"
@@ -39,7 +40,7 @@ class CPDF_StreamContentParser {
CPDF_Dictionary* pResources,
const CFX_FloatRect& rcBBox,
CPDF_AllStates* pAllStates,
- int level);
+ std::set<const uint8_t*>* parsedSet);
~CPDF_StreamContentParser();
uint32_t Parse(const uint8_t* pData, uint32_t dwSize, uint32_t max_cost);
@@ -198,7 +199,7 @@ class CPDF_StreamContentParser {
CFX_UnownedPtr<CPDF_Dictionary> m_pParentResources;
CFX_UnownedPtr<CPDF_Dictionary> m_pResources;
CFX_UnownedPtr<CPDF_PageObjectHolder> m_pObjectHolder;
- const int m_Level;
+ CFX_UnownedPtr<std::set<const uint8_t*>> m_ParsedSet;
CFX_Matrix m_mtContentToUser;
const CFX_FloatRect m_BBox;
ContentParam m_ParamBuf[kParamBufSize];