[ENOMEM] Fix several instances of not checking resize in CFF.
This commit is contained in:
parent
4cbc7d61bc
commit
32f052b033
|
@ -110,7 +110,11 @@ struct str_encoder_t
|
|||
void copy_str (const byte_str_t &str)
|
||||
{
|
||||
unsigned int offset = buff.length;
|
||||
buff.resize (offset + str.length);
|
||||
if (unlikely (!buff.resize (offset + str.length)))
|
||||
{
|
||||
set_error ();
|
||||
return;
|
||||
}
|
||||
if (unlikely (buff.length < offset + str.length))
|
||||
{
|
||||
set_error ();
|
||||
|
@ -412,7 +416,8 @@ struct parsed_cs_str_vec_t : hb_vector_t<parsed_cs_str_t>
|
|||
void init (unsigned int len_ = 0)
|
||||
{
|
||||
SUPER::init ();
|
||||
resize (len_);
|
||||
if (unlikely (!resize (len_)))
|
||||
return;
|
||||
for (unsigned int i = 0; i < length; i++)
|
||||
(*this)[i].init ();
|
||||
}
|
||||
|
@ -528,11 +533,16 @@ struct subr_remaps_t
|
|||
|
||||
void init (unsigned int fdCount)
|
||||
{
|
||||
local_remaps.resize (fdCount);
|
||||
if (unlikely (!local_remaps.resize (fdCount))) return;
|
||||
for (unsigned int i = 0; i < fdCount; i++)
|
||||
local_remaps[i].init ();
|
||||
}
|
||||
|
||||
bool in_error()
|
||||
{
|
||||
return local_remaps.in_error ();
|
||||
}
|
||||
|
||||
void create (subr_closures_t& closures)
|
||||
{
|
||||
global_remap.create (closures.global_closure);
|
||||
|
@ -591,10 +601,19 @@ struct subr_subsetter_t
|
|||
|
||||
parsed_charstrings.init (plan->num_output_glyphs ());
|
||||
parsed_global_subrs.init (acc.globalSubrs->count);
|
||||
parsed_local_subrs.resize (acc.fdCount);
|
||||
|
||||
if (unlikely (remaps.in_error()
|
||||
|| parsed_charstrings.in_error ()
|
||||
|| parsed_global_subrs.in_error ())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (unlikely (!parsed_local_subrs.resize (acc.fdCount))) return false;
|
||||
|
||||
for (unsigned int i = 0; i < acc.fdCount; i++)
|
||||
{
|
||||
parsed_local_subrs[i].init (acc.privateDicts[i].localSubrs->count);
|
||||
if (unlikely (parsed_local_subrs[i].in_error ())) return false;
|
||||
}
|
||||
if (unlikely (!closures.valid))
|
||||
return false;
|
||||
|
|
|
@ -406,7 +406,12 @@ struct cff_subset_plan {
|
|||
hb_codepoint_t code, last_code = CFF_UNDEF_CODE;
|
||||
hb_vector_t<hb_codepoint_t> supp_codes;
|
||||
|
||||
subset_enc_code_ranges.resize (0);
|
||||
if (unlikely (!subset_enc_code_ranges.resize (0)))
|
||||
{
|
||||
plan->check_success (false);
|
||||
return;
|
||||
}
|
||||
|
||||
supp_size = 0;
|
||||
supp_codes.init ();
|
||||
|
||||
|
@ -465,7 +470,12 @@ struct cff_subset_plan {
|
|||
unsigned int size0, size_ranges;
|
||||
hb_codepoint_t sid, last_sid = CFF_UNDEF_CODE;
|
||||
|
||||
subset_charset_ranges.resize (0);
|
||||
if (unlikely (!subset_charset_ranges.resize (0)))
|
||||
{
|
||||
plan->check_success (false);
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned int glyph;
|
||||
for (glyph = 1; glyph < plan->num_output_glyphs (); glyph++)
|
||||
{
|
||||
|
|
|
@ -92,6 +92,12 @@ struct hb_subset_plan_t
|
|||
|
||||
bool in_error () const { return !successful; }
|
||||
|
||||
bool check_success(bool success)
|
||||
{
|
||||
successful = (successful && success);
|
||||
return successful;
|
||||
}
|
||||
|
||||
/*
|
||||
* The set of input glyph ids which will be retained in the subset.
|
||||
* Does NOT include ids kept due to retain_gids. You probably want to use
|
||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue