summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Offenhäuser <offenhaeuser@protonmail.com>2023-02-21 23:56:49 +0100
committerAndreas Kling <kling@serenityos.org>2023-03-22 09:04:00 +0100
commit93062e2b7802a001226ec87f9fd3506dc07bc720 (patch)
tree11de2f7294d32f2635b03a4994ad5e74e7d28a2e
parent6c0f7d83bbbc3ba20aa1a2365825dee3f57eebcf (diff)
downloadserenity-93062e2b7802a001226ec87f9fd3506dc07bc720.zip
LibPDF: Be more cautious of errors when looking for linearization dict
We would previously assume that, following the header, there must be a valid PDF object that could be a linearization dict. However, if the file is not linearized, this is not necessarily true. We now try to detect if there even is an object, and don't treat parsing errors as fatal.
-rw-r--r--Userland/Libraries/LibPDF/DocumentParser.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/Userland/Libraries/LibPDF/DocumentParser.cpp b/Userland/Libraries/LibPDF/DocumentParser.cpp
index b070c30a56..e2c1538e6e 100644
--- a/Userland/Libraries/LibPDF/DocumentParser.cpp
+++ b/Userland/Libraries/LibPDF/DocumentParser.cpp
@@ -111,8 +111,21 @@ PDFErrorOr<void> DocumentParser::parse_header()
PDFErrorOr<DocumentParser::LinearizationResult> DocumentParser::initialize_linearization_dict()
{
- // parse_header() is called immediately before this, so we are at the right location
- auto indirect_value = Value(*TRY(parse_indirect_value()));
+ // parse_header() is called immediately before this, so we are at the right location.
+ // There may not actually be a linearization dict, or even a valid PDF object here.
+ // If that is the case, this file may be completely valid but not linearized.
+
+ // If there is indeed a linearization dict, there should be an object number here.
+ if (!m_reader.matches_number())
+ return LinearizationResult::NotLinearized;
+
+ // At this point, we still don't know for sure if we are dealing with a valid object.
+ auto indirect_value_or_error = parse_indirect_value();
+ if (indirect_value_or_error.is_error())
+ return LinearizationResult::NotLinearized;
+
+ auto indirect_value = indirect_value_or_error.value();
+
auto dict_value = TRY(m_document->resolve(indirect_value));
if (!dict_value.has<NonnullRefPtr<Object>>())
return error("Expected linearization object to be a dictionary");