Replace overly-strong DCHECK() in CPDF_FormField::SetItemSelection(). Early return in error should the condition occur. -- Same for UseSelectedIndicesObject(). Bug: chromium:1477093 Change-Id: I0075020a4d843895e3f9b69e6b5a26467ab66baa Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/111552 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Nigi <nigi@chromium.org>
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp index 705827d..f4a62bd 100644 --- a/core/fpdfdoc/cpdf_formfield.cpp +++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -493,20 +493,24 @@ } bool CPDF_FormField::IsItemSelected(int index) const { - DCHECK(GetType() == kComboBox || GetType() == kListBox); - if (index < 0 || index >= CountOptions()) + if (GetType() != kComboBox && GetType() != kListBox) { return false; - + } + if (index < 0 || index >= CountOptions()) { + return false; + } // First consider the /I entry if it is valid, then fall back to the /V entry. return m_bUseSelectedIndices ? IsSelectedIndex(index) : IsSelectedOption(GetOptionValue(index)); } bool CPDF_FormField::SetItemSelection(int index, NotificationOption notify) { - DCHECK(GetType() == kComboBox || GetType() == kListBox); - if (index < 0 || index >= CountOptions()) + if (GetType() != kComboBox && GetType() != kListBox) { return false; - + } + if (index < 0 || index >= CountOptions()) { + return false; + } WideString opt_value = GetOptionValue(index); if (notify == NotificationOption::kNotify && !NotifyListOrComboBoxBeforeChange(opt_value)) {
diff --git a/fpdfsdk/fpdf_formfill_embeddertest.cpp b/fpdfsdk/fpdf_formfill_embeddertest.cpp index 3f3f51e..259a4fb 100644 --- a/fpdfsdk/fpdf_formfill_embeddertest.cpp +++ b/fpdfsdk/fpdf_formfill_embeddertest.cpp
@@ -1316,6 +1316,22 @@ FORM_OnLButtonUp(form_handle(), page, 0, 140, 590); UnloadPage(page); } + +// Test passes if DCHECK() not hit. +TEST_F(FPDFFormFillEmbedderTest, BUG_1477093) { + EmbedderTestTimerHandlingDelegate delegate; + SetDelegate(&delegate); + + ASSERT_TRUE(OpenDocument("bug_1477093.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + DoOpenActions(); + delegate.AdvanceTime(1000); + delegate.AdvanceTime(1000); + UnloadPage(page); +} + #endif // PDF_ENABLE_V8 TEST_F(FPDFFormFillEmbedderTest, FormText) {
diff --git a/testing/resources/bug_1477093.in b/testing/resources/bug_1477093.in new file mode 100644 index 0000000..4260e7f --- /dev/null +++ b/testing/resources/bug_1477093.in
@@ -0,0 +1,66 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /OpenAction 7 0 R + /Pages 2 0 R +>> +endobj +{{object 2 0}} << + /Type /Pages + /Kids [3 0 R] + /Count 1 +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /Annots [6 0 R] + /MediaBox [0 0 612 792] + /Contents [4 0 R] +>> +endobj +{{object 4 0}} << + {{streamlen}} +>> +stream +% start the stream +1 0 0 1 50 700 cm % text area(50,700) +BT % start the text content + /F0 36 Tf % font size + (Hope u are UseFul!) Tj % font content +ET % end the text content +endstream +endobj +{{object 5 0}} << + {{streamlen}} +>> +stream + function run() { + this.getField('bad_field').value = 'Apple'; + } + app.setTimeOut('run()', 1000 ); +endstream +endobj +{{object 6 0}} << + /Type /Annot + /Subtype /Widget + /F 4 + /FT /Tx + /Opt [(Apple) (Banana)] + /Rect [200 200 400 400] + /T (bad_field) + /V << + /A (b) + >> +>> +endobj +{{object 7 0}} << + /Type /Action + /JS 5 0 R + /S /JavaScript +>> +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF
diff --git a/testing/resources/bug_1477093.pdf b/testing/resources/bug_1477093.pdf new file mode 100644 index 0000000..c04402b --- /dev/null +++ b/testing/resources/bug_1477093.pdf
@@ -0,0 +1,80 @@ +%PDF-1.7 +% ò¤ô +1 0 obj << + /Type /Catalog + /OpenAction 7 0 R + /Pages 2 0 R +>> +endobj +2 0 obj << + /Type /Pages + /Kids [3 0 R] + /Count 1 +>> +endobj +3 0 obj << + /Type /Page + /Parent 2 0 R + /Annots [6 0 R] + /MediaBox [0 0 612 792] + /Contents [4 0 R] +>> +endobj +4 0 obj << + /Length 189 +>> +stream +% start the stream +1 0 0 1 50 700 cm % text area(50,700) +BT % start the text content + /F0 36 Tf % font size + (Hope u are UseFul!) Tj % font content +ET % end the text content +endstream +endobj +5 0 obj << + /Length 105 +>> +stream + function run() { + this.getField('bad_field').value = 'Apple'; + } + app.setTimeOut('run()', 1000 ); +endstream +endobj +6 0 obj << + /Type /Annot + /Subtype /Widget + /F 4 + /FT /Tx + /Opt [(Apple) (Banana)] + /Rect [200 200 400 400] + /T (bad_field) + /V << + /A (b) + >> +>> +endobj +7 0 obj << + /Type /Action + /JS 5 0 R + /S /JavaScript +>> +endobj +xref +0 8 +0000000000 65535 f +0000000015 00000 n +0000000088 00000 n +0000000151 00000 n +0000000266 00000 n +0000000507 00000 n +0000000665 00000 n +0000000830 00000 n +trailer << + /Root 1 0 R + /Size 8 +>> +startxref +896 +%%EOF