From 29c3a9c5f08d540184b477d60d110a04e318fc1a Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 23 Jul 2023 22:06:48 -0400 Subject: [PATCH] LibPDF: Don't crash on images without /Filter Fixes a crash rendering page 819 of ISO_32000-2-2020_sponsored.pdf which contains an uncompressed 2x2 1bpp grayscale bitmap. --- Userland/Libraries/LibPDF/Renderer.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index 89d6e81af9..f42d09f204 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -766,17 +766,19 @@ PDFErrorOr Renderer::show_text(DeprecatedString const& string) PDFErrorOr> Renderer::load_image(NonnullRefPtr image) { auto image_dict = image->dict(); - auto filter_object = TRY(image_dict->get_object(m_document, CommonNames::Filter)); auto width = image_dict->get_value(CommonNames::Width).get(); auto height = image_dict->get_value(CommonNames::Height).get(); - auto is_filter = [&](DeprecatedFlyString const& name) { + auto is_filter = [&](DeprecatedFlyString const& name) -> PDFErrorOr { + if (!image_dict->contains(CommonNames::Filter)) + return false; + auto filter_object = TRY(image_dict->get_object(m_document, CommonNames::Filter)); if (filter_object->is()) return filter_object->cast()->name() == name; auto filters = filter_object->cast(); return MUST(filters->get_name_at(m_document, 0))->name() == name; }; - if (is_filter(CommonNames::JPXDecode)) { + if (TRY(is_filter(CommonNames::JPXDecode))) { return Error(Error::Type::RenderingUnsupported, "JPXDecode filter"); } if (image_dict->contains(CommonNames::ImageMask)) { @@ -807,7 +809,7 @@ PDFErrorOr> Renderer::load_image(NonnullRefPtr to avoid seialisation/deserialisation here return TRY(Gfx::Bitmap::create_from_serialized_bytes(image->bytes())); }