diff options
author | halcanary <halcanary@google.com> | 2016-03-30 12:59:14 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-30 12:59:14 -0700 |
commit | 3243143f25f4ccba632847574cf8e1a8ee0fe0f2 (patch) | |
tree | 7be98e1687373249e5f7bdab0915e4440e7ebf67 | |
parent | 491fb17cab07574a9d5656c1c97ad0acc3af5c70 (diff) |
SkPDF: SkTypeface::openStream could return nullptr
Speculative fix for hard-to-reproduce bug.
BUG=163892
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1842163002
Review URL: https://codereview.chromium.org/1842163002
-rw-r--r-- | src/pdf/SkPDFFont.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp index c42092c09d..8718596b8e 100644 --- a/src/pdf/SkPDFFont.cpp +++ b/src/pdf/SkPDFFont.cpp @@ -590,7 +590,10 @@ static size_t get_subset_font_stream(const char* fontName, SkPDFStream** fontStream) { int ttcIndex; std::unique_ptr<SkStream> fontData(typeface->openStream(&ttcIndex)); - SkASSERT(fontData.get()); + SkASSERT(fontData); + if (!fontData) { + return 0; + } size_t fontSize = fontData->getLength(); @@ -1047,6 +1050,9 @@ bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, typeface(), *subset, &rawStream); + if (0 == fontSize) { + return false; + } if (rawStream) { fontStream.reset(rawStream); fontStream->insertInt("Length1", fontSize); @@ -1059,6 +1065,9 @@ bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, std::unique_ptr<SkStreamAsset> fontData( this->typeface()->openStream(nullptr)); SkASSERT(fontData); + if (!fontData || 0 == fontData->getLength()) { + return false; + } fontSize = fontData->getLength(); SkASSERT(fontSize > 0); fontStream.reset(new SkPDFSharedStream(fontData.release())); @@ -1068,9 +1077,15 @@ bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, } case SkAdvancedTypefaceMetrics::kCFF_Font: case SkAdvancedTypefaceMetrics::kType1CID_Font: { + std::unique_ptr<SkStreamAsset> fontData( + this->typeface()->openStream(nullptr)); + SkASSERT(fontData); + SkASSERT(fontData->getLength() > 0); + if (!fontData || 0 == fontData->getLength()) { + return false; + } sk_sp<SkPDFSharedStream> fontStream( - new SkPDFSharedStream(this->typeface()->openStream(nullptr))); - + new SkPDFSharedStream(fontData.release())); if (getType() == SkAdvancedTypefaceMetrics::kCFF_Font) { fontStream->dict()->insertName("Subtype", "Type1C"); } else { @@ -1198,7 +1213,12 @@ bool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) { size_t header SK_INIT_TO_AVOID_WARNING; size_t data SK_INIT_TO_AVOID_WARNING; size_t trailer SK_INIT_TO_AVOID_WARNING; - std::unique_ptr<SkStream> rawFontData(typeface()->openStream(&ttcIndex)); + std::unique_ptr<SkStreamAsset> rawFontData(typeface()->openStream(&ttcIndex)); + SkASSERT(rawFontData); + SkASSERT(rawFontData->getLength() > 0); + if (!rawFontData || 0 == rawFontData->getLength()) { + return false; + } sk_sp<SkData> fontData(handle_type1_stream(rawFontData.get(), &header, &data, &trailer)); if (fontData.get() == nullptr) { |