From b44334c1c07f307f3e2dbb9ee4ace4c14860a345 Mon Sep 17 00:00:00 2001 From: "edisonn@google.com" Date: Tue, 23 Jul 2013 20:47:05 +0000 Subject: [PATCH] pdfviewer: don't crash if the xref is corrupted. Review URL: https://codereview.chromium.org/20004007 git-svn-id: http://skia.googlecode.com/svn/trunk@10293 2bbb7eff-a529-9590-31e7-b0007b416f81 --- experimental/PdfViewer/SkPdfFont.cpp | 2 +- .../PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/experimental/PdfViewer/SkPdfFont.cpp b/experimental/PdfViewer/SkPdfFont.cpp index 0fec460bf5..e5c880d585 100644 --- a/experimental/PdfViewer/SkPdfFont.cpp +++ b/experimental/PdfViewer/SkPdfFont.cpp @@ -197,7 +197,7 @@ SkPdfFont* fontFromName(SkNativeParsedPDF* doc, SkPdfObject* obj, const char* fo // TODO(edisonn): perf - make a map for (unsigned int i = 0 ; i < doc->objects(); i++) { SkPdfObject* obj = doc->object(i); - if (!obj->isDictionary()) { + if (!obj || !obj->isDictionary()) { continue; } diff --git a/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp b/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp index 4798031808..cc5788bfd7 100644 --- a/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp +++ b/experimental/PdfViewer/pdfparser/native/SkPdfNativeTokenizer.cpp @@ -291,6 +291,9 @@ static int readStringLength(int level, const unsigned char* start, const unsigne } static const unsigned char* readString(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* str, SkPdfAllocator* allocator) { + if (!allocator) { + return end; + } int outLength = readStringLength(level, start, end); // TODO(edisonn): optimize the allocation, don't allocate new string, but put it in a preallocated buffer unsigned char* out = (unsigned char*)allocator->alloc(outLength); @@ -434,6 +437,9 @@ static int readHexStringLength(int level, const unsigned char* start, const unsi } static const unsigned char* readHexString(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* str, SkPdfAllocator* allocator) { + if (!allocator) { + return end; + } int outLength = readHexStringLength(level, start, end); // TODO(edisonn): optimize the allocation, don't allocate new string, but put it in a preallocated buffer unsigned char* out = (unsigned char*)allocator->alloc(outLength); @@ -556,6 +562,9 @@ static int readNameLength(int level, const unsigned char* start, const unsigned } static const unsigned char* readName(int level, const unsigned char* start, const unsigned char* end, SkPdfObject* name, SkPdfAllocator* allocator) { + if (!allocator) { + return end; + } int outLength = readNameLength(level, start, end); // TODO(edisonn): optimize the allocation, don't allocate new string, but put it in a preallocated buffer unsigned char* out = (unsigned char*)allocator->alloc(outLength);