Fix a crash in DataMerge_UpdateBindingRelations().
CXFA_Document::DataMerge_UpdateBindingRelations() expects a valid node
argument. Check all the callers and add checks to those that do not have
them.
For testing, add an alternative to xfa_object_2_0.fragment that makes it
easier to write all the XML in a single object.
BUG=pdfium:1258
Change-Id: I7182bcb5e714af812d97d2e6534c9b2a4e8b53b4
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/51775
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/testing/resources/pixel/xfa_specific/bug_1258_1.in b/testing/resources/pixel/xfa_specific/bug_1258_1.in
new file mode 100644
index 0000000..8777b06
--- /dev/null
+++ b/testing/resources/pixel/xfa_specific/bug_1258_1.in
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/bug_1258_1_expected.pdf.0.png b/testing/resources/pixel/xfa_specific/bug_1258_1_expected.pdf.0.png
new file mode 100644
index 0000000..08c11b0
--- /dev/null
+++ b/testing/resources/pixel/xfa_specific/bug_1258_1_expected.pdf.0.png
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/bug_1258_2.in b/testing/resources/pixel/xfa_specific/bug_1258_2.in
new file mode 100644
index 0000000..01740f3
--- /dev/null
+++ b/testing/resources/pixel/xfa_specific/bug_1258_2.in
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/bug_1258_2_expected.pdf.0.png b/testing/resources/pixel/xfa_specific/bug_1258_2_expected.pdf.0.png
new file mode 100644
index 0000000..08c11b0
--- /dev/null
+++ b/testing/resources/pixel/xfa_specific/bug_1258_2_expected.pdf.0.png
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/bug_1258_3.in b/testing/resources/pixel/xfa_specific/bug_1258_3.in
new file mode 100644
index 0000000..b0c7d8c
--- /dev/null
+++ b/testing/resources/pixel/xfa_specific/bug_1258_3.in
Binary files differ
diff --git a/testing/resources/pixel/xfa_specific/bug_1258_3_expected.pdf.0.png b/testing/resources/pixel/xfa_specific/bug_1258_3_expected.pdf.0.png
new file mode 100644
index 0000000..08c11b0
--- /dev/null
+++ b/testing/resources/pixel/xfa_specific/bug_1258_3_expected.pdf.0.png
Binary files differ
diff --git a/testing/resources/xfa_object_single_2_0.fragment b/testing/resources/xfa_object_single_2_0.fragment
new file mode 100644
index 0000000..67f66d1
--- /dev/null
+++ b/testing/resources/xfa_object_single_2_0.fragment
@@ -0,0 +1,4 @@
+{{object 2 0}} <<
+ /XFA 3 0 R
+>>
+endobj
diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
index 7f8138c..56cb8aa 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
@@ -905,6 +905,9 @@
pBreakLeaderNode = pDocument->DataMerge_CopyContainer(
pLeaderTemplate, pFormNode, pDataScope, true, true, true);
+ if (!pBreakLeaderNode)
+ return false;
+
pDocument->DataMerge_UpdateBindingRelations(pBreakLeaderNode);
SetLayoutGeneratedNodeFlag(pBreakLeaderNode);
}
@@ -917,6 +920,9 @@
pBreakTrailerNode = pDocument->DataMerge_CopyContainer(
pTrailerTemplate, pFormNode, pDataScope, true, true, true);
+ if (!pBreakTrailerNode)
+ return false;
+
pDocument->DataMerge_UpdateBindingRelations(pBreakTrailerNode);
SetLayoutGeneratedNodeFlag(pBreakTrailerNode);
}
@@ -938,6 +944,9 @@
pBookendAppendNode = pDocument->DataMerge_CopyContainer(
pLeaderTemplate, pFormNode, pDataScope, true, true, true);
+ if (!pBookendAppendNode)
+ return false;
+
pDocument->DataMerge_UpdateBindingRelations(pBookendAppendNode);
SetLayoutGeneratedNodeFlag(pBookendAppendNode);
return true;
@@ -1057,6 +1066,9 @@
pLeaderNode = pDocument->DataMerge_CopyContainer(
pLeaderTemplate, pFormNode, pDataScope, true, true, true);
+ if (!pLeaderNode)
+ return false;
+
pDocument->DataMerge_UpdateBindingRelations(pLeaderNode);
SetLayoutGeneratedNodeFlag(pLeaderNode);
}
@@ -1066,6 +1078,9 @@
pTrailerNode = pDocument->DataMerge_CopyContainer(
pTrailerTemplate, pFormNode, pDataScope, true, true, true);
+ if (!pTrailerNode)
+ return false;
+
pDocument->DataMerge_UpdateBindingRelations(pTrailerNode);
SetLayoutGeneratedNodeFlag(pTrailerNode);
}