XFA: Check template children are actually of type template
Do this in CopyContainer_SubformSet() and
CXFA_Node::CloneTemplateToForm() to prevent DCHECK failures and eventual
crashes.
Bug: 41491062, 371233776
Change-Id: I5f69459f89e1187ca2e1c52ef99cfc961f9cfae1
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/125290
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 251e3fa..43a957d 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -1089,6 +1089,9 @@
bool bFound = false;
for (CXFA_Node* pTemplateChild = pTemplateNode->GetFirstChild();
pTemplateChild; pTemplateChild = pTemplateChild->GetNextSibling()) {
+ if (pTemplateChild->GetPacketType() != XFA_PacketType::Template) {
+ continue;
+ }
if (XFA_DataMerge_NeedGenerateForm(pTemplateChild, bUseInstanceManager)) {
XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode,
pTemplateChild, true, nullptr);
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 53461ab..8f6d82c 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -1287,6 +1287,9 @@
if (bRecursive) {
for (CXFA_Node* pChild = GetFirstChild(); pChild;
pChild = pChild->GetNextSibling()) {
+ if (pChild->GetPacketType() != XFA_PacketType::Template) {
+ continue;
+ }
pClone->InsertChildAndNotify(pChild->CloneTemplateToForm(bRecursive),
nullptr);
}