From 7f9fddeaaaddb5a898f1431e7d2d8b89d40fad87 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 22 Feb 2016 20:47:13 -0800 Subject: FPDFPage_HasFormFieldAtPoint should not crash for nullptr pages. BUG=pdfium:401 R=jun_fang@foxitsoftware.com Review URL: https://codereview.chromium.org/1713833003 . --- fpdfsdk/src/fpdfformfill.cpp | 95 +++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 54 deletions(-) diff --git a/fpdfsdk/src/fpdfformfill.cpp b/fpdfsdk/src/fpdfformfill.cpp index e39d623307..c1f332bd74 100644 --- a/fpdfsdk/src/fpdfformfill.cpp +++ b/fpdfsdk/src/fpdfformfill.cpp @@ -56,73 +56,60 @@ DLLEXPORT int STDCALL FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, if (!hHandle) return -1; CPDF_Page* pPage = CPDFPageFromFPDFPage(page); -#ifdef PDF_ENABLE_XFA if (pPage) { CPDF_InterForm interform(pPage->m_pDocument, FALSE); - CPDF_FormControl* pFormCtrl = interform.GetControlAtPoint( - pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y, nullptr); + CPDF_FormControl* pFormCtrl = + interform.GetControlAtPoint(pPage, static_cast(page_x), + static_cast(page_y), nullptr); if (!pFormCtrl) return -1; - CPDF_FormField* pFormField = pFormCtrl->GetField(); - if (!pFormField) - return -1; - - int nType = pFormField->GetFieldType(); - return nType; + return pFormField ? pFormField->GetFieldType() : -1; } - IXFA_PageView* pPageView = ((CPDFXFA_Page*)page)->GetXFAPageView(); - if (pPageView) { - IXFA_WidgetHandler* pWidgetHandler = NULL; - IXFA_DocView* pDocView = pPageView->GetDocView(); - if (!pDocView) - return -1; +#ifdef PDF_ENABLE_XFA + CPDFXFA_Page* pXFAPage = UnderlyingFromFPDFPage(page); + if (!pXFAPage) + return -1; - pWidgetHandler = pDocView->GetWidgetHandler(); - if (!pWidgetHandler) - return -1; + IXFA_PageView* pPageView = pXFAPage->GetXFAPageView(); + if (!pPageView) + return -1; - IXFA_Widget* pXFAAnnot = NULL; - IXFA_WidgetIterator* pWidgetIterator = pPageView->CreateWidgetIterator( - XFA_TRAVERSEWAY_Form, - XFA_WIDGETFILTER_Viewable | XFA_WIDGETFILTER_AllType); - if (!pWidgetIterator) - return -1; - pXFAAnnot = pWidgetIterator->MoveToNext(); - while (pXFAAnnot) { - CFX_RectF rcBBox; - pWidgetHandler->GetBBox(pXFAAnnot, rcBBox, 0); - CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, - rcBBox.left + rcBBox.width, - rcBBox.top + rcBBox.height); - rcWidget.left -= 1.0f; - rcWidget.right += 1.0f; - rcWidget.bottom -= 1.0f; - rcWidget.top += 1.0f; - - if (rcWidget.Contains(static_cast(page_x), - static_cast(page_y))) { - pWidgetIterator->Release(); - return FPDF_FORMFIELD_XFA; - } - pXFAAnnot = pWidgetIterator->MoveToNext(); - } + IXFA_DocView* pDocView = pPageView->GetDocView(); + if (!pDocView) + return -1; - pWidgetIterator->Release(); - } - return -1; -#else // PDF_ENABLE_XFA - if (!pPage) + IXFA_WidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); + if (!pWidgetHandler) return -1; - CPDF_InterForm interform(pPage->m_pDocument, FALSE); - CPDF_FormControl* pFormCtrl = interform.GetControlAtPoint( - pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y, nullptr); - if (!pFormCtrl) + + std::unique_ptr> + pWidgetIterator(pPageView->CreateWidgetIterator( + XFA_TRAVERSEWAY_Form, + XFA_WIDGETFILTER_Viewable | XFA_WIDGETFILTER_AllType)); + if (!pWidgetIterator) return -1; - CPDF_FormField* pFormField = pFormCtrl->GetField(); - return pFormField ? pFormField->GetFieldType() : -1; + + IXFA_Widget* pXFAAnnot = pWidgetIterator->MoveToNext(); + while (pXFAAnnot) { + CFX_RectF rcBBox; + pWidgetHandler->GetBBox(pXFAAnnot, rcBBox, 0); + CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, + rcBBox.top + rcBBox.height); + rcWidget.left -= 1.0f; + rcWidget.right += 1.0f; + rcWidget.bottom -= 1.0f; + rcWidget.top += 1.0f; + + if (rcWidget.Contains(static_cast(page_x), + static_cast(page_y))) { + return FPDF_FORMFIELD_XFA; + } + pXFAAnnot = pWidgetIterator->MoveToNext(); + } #endif // PDF_ENABLE_XFA + return -1; } DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, -- cgit v1.2.3