Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This fuzzer is simplified & cleaned up pdfium/samples/pdfium_test.cc | 5 // This fuzzer is simplified & cleaned up pdfium/samples/pdfium_test.cc |
| 6 | 6 |
| 7 #include <assert.h> | 7 #include <assert.h> |
| 8 #include <limits.h> | 8 #include <limits.h> |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 #include <stdint.h> | 10 #include <stdint.h> |
| 11 #include <stdio.h> | 11 #include <stdio.h> |
| 12 #include <stdlib.h> | 12 #include <stdlib.h> |
| 13 #include <string.h> | 13 #include <string.h> |
| 14 | 14 |
| 15 #ifdef _MSC_VER | 15 #ifdef _MSC_VER |
| 16 #include <Windows.h> | 16 #include <Windows.h> |
| 17 #else | 17 #else |
| 18 #include <unistd.h> | 18 #include <unistd.h> |
| 19 #endif | 19 #endif |
| 20 | 20 |
| 21 #include <list> | 21 #include <list> |
| 22 #include <memory> | |
| 22 #include <sstream> | 23 #include <sstream> |
| 23 #include <string> | 24 #include <string> |
| 24 #include <utility> | 25 #include <utility> |
| 25 #include <vector> | 26 #include <vector> |
| 26 | 27 |
| 28 #include "third_party/pdfium/public/cpp/fpdf_deleters.h" | |
| 27 #include "third_party/pdfium/public/fpdf_dataavail.h" | 29 #include "third_party/pdfium/public/fpdf_dataavail.h" |
| 28 #include "third_party/pdfium/public/fpdf_ext.h" | 30 #include "third_party/pdfium/public/fpdf_ext.h" |
| 29 #include "third_party/pdfium/public/fpdf_formfill.h" | 31 #include "third_party/pdfium/public/fpdf_formfill.h" |
| 30 #include "third_party/pdfium/public/fpdf_text.h" | 32 #include "third_party/pdfium/public/fpdf_text.h" |
| 31 #include "third_party/pdfium/public/fpdfview.h" | 33 #include "third_party/pdfium/public/fpdfview.h" |
| 32 #include "third_party/pdfium/testing/test_support.h" | 34 #include "third_party/pdfium/testing/test_support.h" |
| 33 | 35 |
| 34 #include "v8/include/v8.h" | 36 #include "v8/include/v8.h" |
| 35 | 37 |
| 36 static int ExampleAppAlert(IPDF_JSPLATFORM*, | 38 static int ExampleAppAlert(IPDF_JSPLATFORM*, |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 47 | 49 |
| 48 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { | 50 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { |
| 49 return true; | 51 return true; |
| 50 } | 52 } |
| 51 | 53 |
| 52 static void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {} | 54 static void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {} |
| 53 | 55 |
| 54 static bool RenderPage(const FPDF_DOCUMENT& doc, | 56 static bool RenderPage(const FPDF_DOCUMENT& doc, |
| 55 const FPDF_FORMHANDLE& form, | 57 const FPDF_FORMHANDLE& form, |
| 56 const int page_index) { | 58 const int page_index) { |
| 57 FPDF_PAGE page = FPDF_LoadPage(doc, page_index); | 59 std::unique_ptr<void, FPDFPageDeleter> page(FPDF_LoadPage(doc, page_index)); |
| 58 if (!page) | 60 if (!page) |
| 59 return false; | 61 return false; |
| 60 | 62 |
| 61 FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); | 63 std::unique_ptr<void, FPDFTextPageDeleter> text_page( |
| 62 FORM_OnAfterLoadPage(page, form); | 64 FPDFText_LoadPage(page.get())); |
| 63 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_OPEN); | 65 FORM_OnAfterLoadPage(page.get(), form); |
| 66 FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_OPEN); | |
| 64 | 67 |
| 65 const double scale = 1.0; | 68 const double scale = 1.0; |
| 66 int width = static_cast<int>(FPDF_GetPageWidth(page) * scale); | 69 int width = static_cast<int>(FPDF_GetPageWidth(page.get()) * scale); |
| 67 int height = static_cast<int>(FPDF_GetPageHeight(page) * scale); | 70 int height = static_cast<int>(FPDF_GetPageHeight(page.get()) * scale); |
| 68 | 71 std::unique_ptr<void, FPDFBitmapDeleter> bitmap( |
| 69 FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0); | 72 FPDFBitmap_Create(width, height, 0)); |
| 70 if (bitmap) { | 73 if (bitmap) { |
| 71 FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); | 74 FPDFBitmap_FillRect(bitmap.get(), 0, 0, width, height, 0xFFFFFFFF); |
| 72 FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0); | 75 FPDF_RenderPageBitmap(bitmap.get(), page.get(), 0, 0, width, height, 0, 0); |
| 73 | 76 FPDF_FFLDraw(form, bitmap.get(), page.get(), 0, 0, width, height, 0, 0); |
| 74 FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, 0); | |
| 75 | |
| 76 FPDFBitmap_Destroy(bitmap); | |
| 77 } | 77 } |
| 78 FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); | 78 FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_CLOSE); |
| 79 FORM_OnBeforeClosePage(page, form); | 79 FORM_OnBeforeClosePage(page.get(), form); |
| 80 FPDFText_ClosePage(text_page); | |
| 81 FPDF_ClosePage(page); | |
| 82 return !!bitmap; | 80 return !!bitmap; |
| 83 } | 81 } |
| 84 | 82 |
| 85 static void RenderPdf(const char* pBuf, size_t len) { | 83 static void RenderPdf(const char* pBuf, size_t len) { |
| 86 IPDF_JSPLATFORM platform_callbacks; | 84 IPDF_JSPLATFORM platform_callbacks; |
| 87 memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); | 85 memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); |
| 88 platform_callbacks.version = 3; | 86 platform_callbacks.version = 3; |
| 89 platform_callbacks.app_alert = ExampleAppAlert; | 87 platform_callbacks.app_alert = ExampleAppAlert; |
| 90 platform_callbacks.Doc_gotoPage = ExampleDocGotoPage; | 88 platform_callbacks.Doc_gotoPage = ExampleDocGotoPage; |
| 91 | 89 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 104 FX_FILEAVAIL file_avail; | 102 FX_FILEAVAIL file_avail; |
| 105 memset(&file_avail, '\0', sizeof(file_avail)); | 103 memset(&file_avail, '\0', sizeof(file_avail)); |
| 106 file_avail.version = 1; | 104 file_avail.version = 1; |
| 107 file_avail.IsDataAvail = Is_Data_Avail; | 105 file_avail.IsDataAvail = Is_Data_Avail; |
| 108 | 106 |
| 109 FX_DOWNLOADHINTS hints; | 107 FX_DOWNLOADHINTS hints; |
| 110 memset(&hints, '\0', sizeof(hints)); | 108 memset(&hints, '\0', sizeof(hints)); |
| 111 hints.version = 1; | 109 hints.version = 1; |
| 112 hints.AddSegment = Add_Segment; | 110 hints.AddSegment = Add_Segment; |
| 113 | 111 |
| 114 FPDF_DOCUMENT doc; | 112 std::unique_ptr<void, FPDFDocumentDeleter> doc; |
|
Lei Zhang
2017/03/17 18:42:09
Move this below |pdf_avail| so we preserve the sam
Tom Sepez
2017/03/17 18:47:06
Done.
| |
| 115 int nRet = PDF_DATA_NOTAVAIL; | 113 int nRet = PDF_DATA_NOTAVAIL; |
| 116 bool bIsLinearized = false; | 114 bool bIsLinearized = false; |
| 117 FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access); | 115 std::unique_ptr<void, FPDFAvailDeleter> pdf_avail( |
| 116 FPDFAvail_Create(&file_avail, &file_access)); | |
| 118 | 117 |
| 119 if (FPDFAvail_IsLinearized(pdf_avail) == PDF_LINEARIZED) { | 118 if (FPDFAvail_IsLinearized(pdf_avail.get()) == PDF_LINEARIZED) { |
| 120 doc = FPDFAvail_GetDocument(pdf_avail, nullptr); | 119 doc.reset(FPDFAvail_GetDocument(pdf_avail.get(), nullptr)); |
| 121 if (doc) { | 120 if (doc) { |
| 122 while (nRet == PDF_DATA_NOTAVAIL) { | 121 while (nRet == PDF_DATA_NOTAVAIL) |
| 123 nRet = FPDFAvail_IsDocAvail(pdf_avail, &hints); | 122 nRet = FPDFAvail_IsDocAvail(pdf_avail.get(), &hints); |
| 124 } | 123 |
| 125 if (nRet == PDF_DATA_ERROR) { | 124 if (nRet == PDF_DATA_ERROR) |
| 126 return; | 125 return; |
| 127 } | 126 |
| 128 nRet = FPDFAvail_IsFormAvail(pdf_avail, &hints); | 127 nRet = FPDFAvail_IsFormAvail(pdf_avail.get(), &hints); |
| 129 if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL) { | 128 if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL) |
| 130 return; | 129 return; |
| 131 } | 130 |
| 132 bIsLinearized = true; | 131 bIsLinearized = true; |
| 133 } | 132 } |
| 134 } else { | 133 } else { |
| 135 doc = FPDF_LoadCustomDocument(&file_access, nullptr); | 134 doc.reset(FPDF_LoadCustomDocument(&file_access, nullptr)); |
| 136 } | 135 } |
| 137 | 136 |
| 138 if (!doc) { | 137 if (!doc) |
| 139 FPDFAvail_Destroy(pdf_avail); | |
| 140 return; | 138 return; |
| 141 } | |
| 142 | 139 |
| 143 (void)FPDF_GetDocPermissions(doc); | 140 (void)FPDF_GetDocPermissions(doc.get()); |
| 144 | 141 |
| 145 FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks); | 142 std::unique_ptr<void, FPDFFormHandleDeleter> form( |
| 146 FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD); | 143 FPDFDOC_InitFormFillEnvironment(doc.get(), &form_callbacks)); |
| 147 FPDF_SetFormFieldHighlightAlpha(form, 100); | 144 FPDF_SetFormFieldHighlightColor(form.get(), 0, 0xFFE4DD); |
| 145 FPDF_SetFormFieldHighlightAlpha(form.get(), 100); | |
| 146 FORM_DoDocumentJSAction(form.get()); | |
| 147 FORM_DoDocumentOpenAction(form.get()); | |
| 148 | 148 |
| 149 FORM_DoDocumentJSAction(form); | 149 int page_count = FPDF_GetPageCount(doc.get()); |
| 150 FORM_DoDocumentOpenAction(form); | |
| 151 | |
| 152 int page_count = FPDF_GetPageCount(doc); | |
| 153 | |
| 154 for (int i = 0; i < page_count; ++i) { | 150 for (int i = 0; i < page_count; ++i) { |
| 155 if (bIsLinearized) { | 151 if (bIsLinearized) { |
| 156 nRet = PDF_DATA_NOTAVAIL; | 152 nRet = PDF_DATA_NOTAVAIL; |
| 157 while (nRet == PDF_DATA_NOTAVAIL) { | 153 while (nRet == PDF_DATA_NOTAVAIL) |
| 158 nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints); | 154 nRet = FPDFAvail_IsPageAvail(pdf_avail.get(), i, &hints); |
| 159 } | 155 |
| 160 if (nRet == PDF_DATA_ERROR) { | 156 if (nRet == PDF_DATA_ERROR) |
| 161 return; | 157 return; |
| 162 } | |
| 163 } | 158 } |
| 164 RenderPage(doc, form, i); | 159 RenderPage(doc.get(), form.get(), i); |
| 165 } | 160 } |
| 166 | 161 FORM_DoDocumentAAction(form.get(), FPDFDOC_AACTION_WC); |
| 167 FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); | |
| 168 FPDFDOC_ExitFormFillEnvironment(form); | |
| 169 FPDF_CloseDocument(doc); | |
| 170 FPDFAvail_Destroy(pdf_avail); | |
| 171 } | 162 } |
| 172 | 163 |
| 173 std::string ProgramPath() { | 164 std::string ProgramPath() { |
| 174 #ifdef _MSC_VER | 165 #ifdef _MSC_VER |
| 175 wchar_t wpath[MAX_PATH]; | 166 wchar_t wpath[MAX_PATH]; |
| 176 char path[MAX_PATH]; | 167 char path[MAX_PATH]; |
| 177 DWORD res = GetModuleFileName(NULL, wpath, MAX_PATH); | 168 DWORD res = GetModuleFileName(NULL, wpath, MAX_PATH); |
| 178 assert(res != 0); | 169 assert(res != 0); |
| 179 wcstombs(path, wpath, MAX_PATH); | 170 wcstombs(path, wpath, MAX_PATH); |
| 180 return std::string(path, res); | 171 return std::string(path, res); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 FPDF_LIBRARY_CONFIG config; | 204 FPDF_LIBRARY_CONFIG config; |
| 214 UNSUPPORT_INFO unsupport_info; | 205 UNSUPPORT_INFO unsupport_info; |
| 215 }; | 206 }; |
| 216 | 207 |
| 217 static TestCase* testCase = new TestCase(); | 208 static TestCase* testCase = new TestCase(); |
| 218 | 209 |
| 219 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | 210 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
| 220 RenderPdf(reinterpret_cast<const char*>(data), size); | 211 RenderPdf(reinterpret_cast<const char*>(data), size); |
| 221 return 0; | 212 return 0; |
| 222 } | 213 } |
| OLD | NEW |