Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1472)

Unified Diff: pdf/pdfium/fuzzers/pdfium_fuzzer.cc

Issue 2746363009: Avoid leaks in pdfium_fuzzer by using unique_ptr<> (Closed)
Patch Set: destruction order Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pdf/pdfium/fuzzers/pdfium_fuzzer.cc
diff --git a/pdf/pdfium/fuzzers/pdfium_fuzzer.cc b/pdf/pdfium/fuzzers/pdfium_fuzzer.cc
index b0d7b5de26c250081ce4da2df3a444d5bb3136b7..658be7eca6796a2b884a560022e5b5c88a3a610c 100644
--- a/pdf/pdfium/fuzzers/pdfium_fuzzer.cc
+++ b/pdf/pdfium/fuzzers/pdfium_fuzzer.cc
@@ -19,11 +19,13 @@
#endif
#include <list>
+#include <memory>
#include <sstream>
#include <string>
#include <utility>
#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_ext.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) {}
static bool RenderPage(const FPDF_DOCUMENT& doc,
const FPDF_FORMHANDLE& form,
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)
return false;
- FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);
- FORM_OnAfterLoadPage(page, form);
- FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN);
+ std::unique_ptr<void, FPDFTextPageDeleter> text_page(
+ FPDFText_LoadPage(page.get()));
+ FORM_OnAfterLoadPage(page.get(), form);
+ FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_OPEN);
const double scale = 1.0;
- int width = static_cast<int>(FPDF_GetPageWidth(page) * scale);
- int height = static_cast<int>(FPDF_GetPageHeight(page) * scale);
-
- FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0);
+ int width = static_cast<int>(FPDF_GetPageWidth(page.get()) * scale);
+ int height = static_cast<int>(FPDF_GetPageHeight(page.get()) * scale);
+ std::unique_ptr<void, FPDFBitmapDeleter> bitmap(
+ FPDFBitmap_Create(width, height, 0));
if (bitmap) {
- FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF);
- FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);
-
- FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0);
-
- FPDFBitmap_Destroy(bitmap);
+ FPDFBitmap_FillRect(bitmap.get(), 0, 0, width, height, 0xFFFFFFFF);
+ 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);
}
- FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE);
- FORM_OnBeforeClosePage(page, form);
- FPDFText_ClosePage(text_page);
- FPDF_ClosePage(page);
+ FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_CLOSE);
+ FORM_OnBeforeClosePage(page.get(), form);
return !!bitmap;
}
@@ -111,63 +109,56 @@ static void RenderPdf(const char* pBuf, size_t len) {
hints.version = 1;
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;
bool bIsLinearized = false;
- FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access);
-
- if (FPDFAvail_IsLinearized(pdf_avail) == PDF_LINEARIZED) {
- doc = FPDFAvail_GetDocument(pdf_avail, nullptr);
+ std::unique_ptr<void, FPDFDocumentDeleter> doc;
+ if (FPDFAvail_IsLinearized(pdf_avail.get()) == PDF_LINEARIZED) {
+ doc.reset(FPDFAvail_GetDocument(pdf_avail.get(), nullptr));
if (doc) {
- while (nRet == PDF_DATA_NOTAVAIL) {
- nRet = FPDFAvail_IsDocAvail(pdf_avail, &hints);
- }
- if (nRet == PDF_DATA_ERROR) {
+ while (nRet == PDF_DATA_NOTAVAIL)
+ nRet = FPDFAvail_IsDocAvail(pdf_avail.get(), &hints);
+
+ if (nRet == PDF_DATA_ERROR)
return;
- }
- nRet = FPDFAvail_IsFormAvail(pdf_avail, &hints);
- if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL) {
+
+ nRet = FPDFAvail_IsFormAvail(pdf_avail.get(), &hints);
+ if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL)
return;
- }
+
bIsLinearized = true;
}
} else {
- doc = FPDF_LoadCustomDocument(&file_access, nullptr);
+ doc.reset(FPDF_LoadCustomDocument(&file_access, nullptr));
}
- if (!doc) {
- FPDFAvail_Destroy(pdf_avail);
+ if (!doc)
return;
- }
-
- (void)FPDF_GetDocPermissions(doc);
- FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks);
- FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD);
- FPDF_SetFormFieldHighlightAlpha(form, 100);
+ (void)FPDF_GetDocPermissions(doc.get());
- FORM_DoDocumentJSAction(form);
- 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) {
if (bIsLinearized) {
nRet = PDF_DATA_NOTAVAIL;
- while (nRet == PDF_DATA_NOTAVAIL) {
- nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints);
- }
- if (nRet == PDF_DATA_ERROR) {
+ while (nRet == PDF_DATA_NOTAVAIL)
+ nRet = FPDFAvail_IsPageAvail(pdf_avail.get(), i, &hints);
+
+ if (nRet == PDF_DATA_ERROR)
return;
- }
}
- RenderPage(doc, form, i);
+ RenderPage(doc.get(), form.get(), i);
}
-
- FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC);
- FPDFDOC_ExitFormFillEnvironment(form);
- FPDF_CloseDocument(doc);
- FPDFAvail_Destroy(pdf_avail);
+ FORM_DoDocumentAAction(form.get(), FPDFDOC_AACTION_WC);
}
std::string ProgramPath() {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698