diff options
-rw-r--r-- | BUILD.gn | 1 | ||||
-rw-r--r-- | pdfium.gyp | 1 | ||||
-rw-r--r-- | testing/resources/bug_216.pdf | 39 | ||||
-rw-r--r-- | xfa/src/fxfa/src/parser/xfa_parser_imp.cpp | 16 | ||||
-rw-r--r-- | xfa/src/fxfa/src/parser/xfa_parser_imp_embeddertest.cpp | 15 |
5 files changed, 71 insertions, 1 deletions
@@ -1511,6 +1511,7 @@ test("pdfium_embeddertests") { "testing/embedder_test.h", "testing/embedder_test_mock_delegate.h", "testing/embedder_test_timer_handling_delegate.h", + "xfa/src/fxfa/src/parser/xfa_parser_imp_embeddertest.cpp", ] deps = [ "//testing/gmock", diff --git a/pdfium.gyp b/pdfium.gyp index b101096439..22d6304302 100644 --- a/pdfium.gyp +++ b/pdfium.gyp @@ -806,6 +806,7 @@ 'testing/embedder_test.h', 'testing/embedder_test_mock_delegate.h', 'testing/embedder_test_timer_handling_delegate.h', + 'xfa/src/fxfa/src/parser/xfa_parser_imp_embeddertest.cpp', ], 'conditions': [ ['pdf_enable_v8==1', { diff --git a/testing/resources/bug_216.pdf b/testing/resources/bug_216.pdf new file mode 100644 index 0000000000..1cb88845a4 --- /dev/null +++ b/testing/resources/bug_216.pdf @@ -0,0 +1,39 @@ +%PDF-1.7 +1 0 obj << + /Type /Catalog + /Pages 2 0 R + /AcroForm 4 0 R +>> +endobj +2 0 obj << + /Type /Pages + /Count 1 +>> +endobj +4 0 obj << + /XFA [ + (xdp:xdp) 23 0 R + (form) 29 0 R + (</xdp:xdp>) 30 0 R] +>> +endobj +23 0 obj << +>>stream +<?xml version="1.0" encoding="UTF-8"?> +<xdp:xdp xmlns:xdp="http://www.foxitsoftware.com/"> +endstream +endobj +29 0 obj << +>>stream +<form xmlns="http://www.xfa.org/schema/xfa-form/2.6/"> +</form> +endstream +endobj +30 0 obj << +>>stream +</xdp:xdp> +endstream +endobj +trailer +<</Root 1 0 R>> +%%EOF diff --git a/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp b/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp index 9e85c1f539..66258980e5 100644 --- a/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp +++ b/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp @@ -433,6 +433,7 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP( }
IFDE_XMLNode* pXMLDatasetsDOMRoot = NULL;
IFDE_XMLNode* pXMLFormDOMRoot = NULL;
+ IFDE_XMLNode* pXMLTemplateDOMRoot = NULL;
{
for (IFDE_XMLNode* pChildItem =
pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild);
@@ -473,7 +474,17 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP( return NULL;
}
pXMLFormDOMRoot = pElement;
- } else {
+ } else if (ePacket == XFA_XDPPACKET_Template) {
+ if (pXMLTemplateDOMRoot) {
+ // Find a duplicate template packet
+ return NULL;
+ }
+ CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket);
+ if (pPacketNode) {
+ pXMLTemplateDOMRoot = pElement;
+ pXFARootNode->InsertChild(pPacketNode);
+ }
+ } else {
CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket);
if (pPacketNode) {
if (pPacketInfo &&
@@ -486,6 +497,9 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP( }
}
}
+ if (!pXMLTemplateDOMRoot) {
+ return NULL;
+ }
if (pXMLDatasetsDOMRoot) {
CXFA_Node* pPacketNode =
ParseAsXDPPacket(pXMLDatasetsDOMRoot, XFA_XDPPACKET_Datasets);
diff --git a/xfa/src/fxfa/src/parser/xfa_parser_imp_embeddertest.cpp b/xfa/src/fxfa/src/parser/xfa_parser_imp_embeddertest.cpp new file mode 100644 index 0000000000..8bff2f6874 --- /dev/null +++ b/xfa/src/fxfa/src/parser/xfa_parser_imp_embeddertest.cpp @@ -0,0 +1,15 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "../../../../../testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class XFAParserImpEmbeddertest : public EmbedderTest {}; + +TEST_F(XFAParserImpEmbeddertest, Bug_216) { + EXPECT_TRUE(OpenDocument("testing/resources/bug_216.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + UnloadPage(page); +}
\ No newline at end of file |