mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 00:57:45 +00:00
LibPDF: Disallow parsing indirect values as operands
An operation like 0 0 0 RG would have been confused for [ 0, 0 0 R ] G
This commit is contained in:
parent
04cb00dc9a
commit
65e83bed53
2 changed files with 17 additions and 5 deletions
|
@ -53,7 +53,7 @@ String Parser::parse_comment()
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
PDFErrorOr<Value> Parser::parse_value()
|
PDFErrorOr<Value> Parser::parse_value(CanBeIndirectValue can_be_indirect_value)
|
||||||
{
|
{
|
||||||
parse_comment();
|
parse_comment();
|
||||||
|
|
||||||
|
@ -75,8 +75,12 @@ PDFErrorOr<Value> Parser::parse_value()
|
||||||
return Value(false);
|
return Value(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_reader.matches_number())
|
if (m_reader.matches_number()) {
|
||||||
|
if (can_be_indirect_value == CanBeIndirectValue::Yes)
|
||||||
return parse_possible_indirect_value_or_ref();
|
return parse_possible_indirect_value_or_ref();
|
||||||
|
else
|
||||||
|
return parse_number();
|
||||||
|
}
|
||||||
|
|
||||||
if (m_reader.matches('/'))
|
if (m_reader.matches('/'))
|
||||||
return MUST(parse_name());
|
return MUST(parse_name());
|
||||||
|
@ -513,7 +517,10 @@ PDFErrorOr<Vector<Operator>> Parser::parse_operators()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
operator_args.append(TRY(parse_value()));
|
// Note: We disallow parsing indirect values here, since
|
||||||
|
// operations like 0 0 0 RG would confuse the parser
|
||||||
|
auto v = TRY(parse_value(CanBeIndirectValue::No));
|
||||||
|
operator_args.append(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
return operators;
|
return operators;
|
||||||
|
|
|
@ -38,7 +38,12 @@ public:
|
||||||
void move_by(size_t count) { m_reader.move_by(count); }
|
void move_by(size_t count) { m_reader.move_by(count); }
|
||||||
void move_to(size_t offset) { m_reader.move_to(offset); }
|
void move_to(size_t offset) { m_reader.move_to(offset); }
|
||||||
|
|
||||||
PDFErrorOr<Value> parse_value();
|
enum class CanBeIndirectValue {
|
||||||
|
No,
|
||||||
|
Yes
|
||||||
|
};
|
||||||
|
|
||||||
|
PDFErrorOr<Value> parse_value(CanBeIndirectValue = CanBeIndirectValue::Yes);
|
||||||
PDFErrorOr<Value> parse_possible_indirect_value_or_ref();
|
PDFErrorOr<Value> parse_possible_indirect_value_or_ref();
|
||||||
PDFErrorOr<NonnullRefPtr<IndirectValue>> parse_indirect_value(u32 index, u32 generation);
|
PDFErrorOr<NonnullRefPtr<IndirectValue>> parse_indirect_value(u32 index, u32 generation);
|
||||||
PDFErrorOr<NonnullRefPtr<IndirectValue>> parse_indirect_value();
|
PDFErrorOr<NonnullRefPtr<IndirectValue>> parse_indirect_value();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue