Commit e13fdde8 authored by tsepez's avatar tsepez Committed by Commit bot

Avoid leaks in pdfium_fuzzer by using unique_ptr<>

BUG=702064

Review-Url: https://codereview.chromium.org/2746363009
Cr-Commit-Position: refs/heads/master@{#457838}
parent 404ba0c7
...@@ -19,11 +19,13 @@ ...@@ -19,11 +19,13 @@
#endif #endif
#include <list> #include <list>
#include <memory>
#include <sstream> #include <sstream>
#include <string> #include <string>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "third_party/pdfium/public/cpp/fpdf_deleters.h"
#include "third_party/pdfium/public/fpdf_dataavail.h" #include "third_party/pdfium/public/fpdf_dataavail.h"
#include "third_party/pdfium/public/fpdf_ext.h" #include "third_party/pdfium/public/fpdf_ext.h"
#include "third_party/pdfium/public/fpdf_formfill.h" #include "third_party/pdfium/public/fpdf_formfill.h"
...@@ -54,31 +56,27 @@ static void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {} ...@@ -54,31 +56,27 @@ static void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {}
static bool RenderPage(const FPDF_DOCUMENT& doc, static bool RenderPage(const FPDF_DOCUMENT& doc,
const FPDF_FORMHANDLE& form, const FPDF_FORMHANDLE& form,
const int page_index) { const int page_index) {
FPDF_PAGE page = FPDF_LoadPage(doc, page_index); std::unique_ptr<void, FPDFPageDeleter> page(FPDF_LoadPage(doc, page_index));
if (!page) if (!page)
return false; return false;
FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); std::unique_ptr<void, FPDFTextPageDeleter> text_page(
FORM_OnAfterLoadPage(page, form); FPDFText_LoadPage(page.get()));
FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN); FORM_OnAfterLoadPage(page.get(), form);
FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_OPEN);
const double scale = 1.0; const double scale = 1.0;
int width = static_cast<int>(FPDF_GetPageWidth(page) * scale); int width = static_cast<int>(FPDF_GetPageWidth(page.get()) * scale);
int height = static_cast<int>(FPDF_GetPageHeight(page) * scale); int height = static_cast<int>(FPDF_GetPageHeight(page.get()) * scale);
std::unique_ptr<void, FPDFBitmapDeleter> bitmap(
FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0); FPDFBitmap_Create(width, height, 0));
if (bitmap) { if (bitmap) {
FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); FPDFBitmap_FillRect(bitmap.get(), 0, 0, width, height, 0xFFFFFFFF);
FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0); FPDF_RenderPageBitmap(bitmap.get(), page.get(), 0, 0, width, height, 0, 0);
FPDF_FFLDraw(form, bitmap.get(), page.get(), 0, 0, width, height, 0, 0);
FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0);
FPDFBitmap_Destroy(bitmap);
} }
FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_CLOSE);
FORM_OnBeforeClosePage(page, form); FORM_OnBeforeClosePage(page.get(), form);
FPDFText_ClosePage(text_page);
FPDF_ClosePage(page);
return !!bitmap; return !!bitmap;
} }
...@@ -111,63 +109,56 @@ static void RenderPdf(const char* pBuf, size_t len) { ...@@ -111,63 +109,56 @@ static void RenderPdf(const char* pBuf, size_t len) {
hints.version = 1; hints.version = 1;
hints.AddSegment = Add_Segment; hints.AddSegment = Add_Segment;
FPDF_DOCUMENT doc; std::unique_ptr<void, FPDFAvailDeleter> pdf_avail(
FPDFAvail_Create(&file_avail, &file_access));
int nRet = PDF_DATA_NOTAVAIL; int nRet = PDF_DATA_NOTAVAIL;
bool bIsLinearized = false; bool bIsLinearized = false;
FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access); std::unique_ptr<void, FPDFDocumentDeleter> doc;
if (FPDFAvail_IsLinearized(pdf_avail.get()) == PDF_LINEARIZED) {
if (FPDFAvail_IsLinearized(pdf_avail) == PDF_LINEARIZED) { doc.reset(FPDFAvail_GetDocument(pdf_avail.get(), nullptr));
doc = FPDFAvail_GetDocument(pdf_avail, nullptr);
if (doc) { if (doc) {
while (nRet == PDF_DATA_NOTAVAIL) { while (nRet == PDF_DATA_NOTAVAIL)
nRet = FPDFAvail_IsDocAvail(pdf_avail, &hints); nRet = FPDFAvail_IsDocAvail(pdf_avail.get(), &hints);
}
if (nRet == PDF_DATA_ERROR) { if (nRet == PDF_DATA_ERROR)
return; return;
}
nRet = FPDFAvail_IsFormAvail(pdf_avail, &hints); nRet = FPDFAvail_IsFormAvail(pdf_avail.get(), &hints);
if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL) { if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL)
return; return;
}
bIsLinearized = true; bIsLinearized = true;
} }
} else { } else {
doc = FPDF_LoadCustomDocument(&file_access, nullptr); doc.reset(FPDF_LoadCustomDocument(&file_access, nullptr));
} }
if (!doc) { if (!doc)
FPDFAvail_Destroy(pdf_avail);
return; return;
}
(void)FPDF_GetDocPermissions(doc);
FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks);
FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD);
FPDF_SetFormFieldHighlightAlpha(form, 100);
FORM_DoDocumentJSAction(form); (void)FPDF_GetDocPermissions(doc.get());
FORM_DoDocumentOpenAction(form);
int page_count = FPDF_GetPageCount(doc); std::unique_ptr<void, FPDFFormHandleDeleter> form(
FPDFDOC_InitFormFillEnvironment(doc.get(), &form_callbacks));
FPDF_SetFormFieldHighlightColor(form.get(), 0, 0xFFE4DD);
FPDF_SetFormFieldHighlightAlpha(form.get(), 100);
FORM_DoDocumentJSAction(form.get());
FORM_DoDocumentOpenAction(form.get());
int page_count = FPDF_GetPageCount(doc.get());
for (int i = 0; i < page_count; ++i) { for (int i = 0; i < page_count; ++i) {
if (bIsLinearized) { if (bIsLinearized) {
nRet = PDF_DATA_NOTAVAIL; nRet = PDF_DATA_NOTAVAIL;
while (nRet == PDF_DATA_NOTAVAIL) { while (nRet == PDF_DATA_NOTAVAIL)
nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints); nRet = FPDFAvail_IsPageAvail(pdf_avail.get(), i, &hints);
}
if (nRet == PDF_DATA_ERROR) { if (nRet == PDF_DATA_ERROR)
return; return;
} }
RenderPage(doc.get(), form.get(), i);
} }
RenderPage(doc, form, i); FORM_DoDocumentAAction(form.get(), FPDFDOC_AACTION_WC);
}
FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC);
FPDFDOC_ExitFormFillEnvironment(form);
FPDF_CloseDocument(doc);
FPDFAvail_Destroy(pdf_avail);
} }
std::string ProgramPath() { std::string ProgramPath() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment