diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc index a39db08aa..8cfb20216 100644 --- a/src/hb-subset-cff1.cc +++ b/src/hb-subset-cff1.cc @@ -714,24 +714,34 @@ static bool _serialize_cff1 (hb_serialize_context_t *c, objidx_t subrs_link = 0; if (plan.subset_localsubrs[i].length > 0) { - c->push (); CFF1Subrs *dest = c->start_embed (); if (unlikely (dest == nullptr)) return false; - if (unlikely (!dest->serialize (c, plan.subset_localsubrs[i]))) return false; - subrs_link = c->pop_pack (); + c->push (); + if (likely (dest && dest->serialize (c, plan.subset_localsubrs[i]))) + subrs_link = c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } - c->push (); PrivateDict *pd = c->start_embed (); if (unlikely (pd == nullptr)) return false; - bool result; + c->push (); cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints); /* N.B. local subrs immediately follows its corresponding private dict. i.e., subr offset == private dict size */ - result = pd->serialize (c, acc.privateDicts[i], privSzr, subrs_link); - if (unlikely (!result)) return false; - unsigned fd = plan.fdmap[i]; - plan.fontdicts_mod[fd].privateDictInfo.size = c->length (); - plan.fontdicts_mod[fd].privateDictInfo.link = c->pop_pack (); + if (likely (pd->serialize (c, acc.privateDicts[i], privSzr, subrs_link))) + { + unsigned fd = plan.fdmap[i]; + plan.fontdicts_mod[fd].privateDictInfo.size = c->length (); + plan.fontdicts_mod[fd].privateDictInfo.link = c->pop_pack (); + } + else + { + c->pop_discard (); + return false; + } } } @@ -740,46 +750,66 @@ static bool _serialize_cff1 (hb_serialize_context_t *c, /* CharStrings */ { - c->push (); CFF1CharStrings *cs = c->start_embed (); if (unlikely (cs == nullptr)) return false; - if (unlikely (!cs->serialize (c, plan.subset_charstrings))) return false; - plan.info.char_strings_link = c->pop_pack (); + c->push (); + if (likely (cs->serialize (c, plan.subset_charstrings))) + plan.info.char_strings_link = c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } /* FDArray (FD Index) */ if (acc.fdArray != &Null(CFF1FDArray)) { - c->push (); CFF1FDArray *fda = c->start_embed (); if (unlikely (fda == nullptr)) return false; + c->push (); cff1_font_dict_op_serializer_t fontSzr; auto it = + hb_zip (+ hb_iter (plan.fontdicts_mod), + hb_iter (plan.fontdicts_mod)); - if (unlikely (!fda->serialize (c, it, fontSzr))) return false; - plan.info.fd_array_link = c->pop_pack (false); + if (likely (fda->serialize (c, it, fontSzr))) + plan.info.fd_array_link = c->pop_pack (false); + else + { + c->pop_discard (); + return false; + } } /* FDSelect */ if (acc.fdSelect != &Null(CFF1FDSelect)) { c->push (); - if (unlikely (!hb_serialize_cff_fdselect (c, num_glyphs, *acc.fdSelect, acc.fdCount, - plan.subset_fdselect_format, plan.info.fd_select.size, - plan.subset_fdselect_ranges))) return false; - plan.info.fd_select.link = c->pop_pack (); + if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *acc.fdSelect, acc.fdCount, + plan.subset_fdselect_format, plan.info.fd_select.size, + plan.subset_fdselect_ranges))) + plan.info.fd_select.link = c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } /* Charset */ if (plan.subset_charset) { - c->push (); Charset *dest = c->start_embed (); if (unlikely (dest == nullptr)) return false; - if (unlikely (!dest->serialize (c, - plan.subset_charset_format, - plan.num_glyphs, - plan.subset_charset_ranges))) return false; - plan.info.charset_link = c->pop_pack (); + c->push (); + if (likely (dest->serialize (c, + plan.subset_charset_format, + plan.num_glyphs, + plan.subset_charset_ranges))) + plan.info.charset_link = c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } /* Encoding */ @@ -788,12 +818,17 @@ static bool _serialize_cff1 (hb_serialize_context_t *c, Encoding *dest = c->start_embed (); if (unlikely (dest == nullptr)) return false; c->push (); - if (unlikely (!dest->serialize (c, - plan.subset_enc_format, - plan.subset_enc_num_codes, - plan.subset_enc_code_ranges, - plan.subset_enc_supp_codes))) return false; - plan.info.encoding_link = c->pop_pack (); + if (likely (dest->serialize (c, + plan.subset_enc_format, + plan.subset_enc_num_codes, + plan.subset_enc_code_ranges, + plan.subset_enc_supp_codes))) + plan.info.encoding_link = c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } /* global subrs */ @@ -801,17 +836,27 @@ static bool _serialize_cff1 (hb_serialize_context_t *c, c->push (); CFF1Subrs *dest = c->start_embed (); if (unlikely (dest == nullptr)) return false; - if (unlikely (!dest->serialize (c, plan.subset_globalsubrs))) return false; - c->pop_pack (); + if (likely (dest->serialize (c, plan.subset_globalsubrs))) + c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } /* String INDEX */ { - c->push (); CFF1StringIndex *dest = c->start_embed (); if (unlikely (dest == nullptr)) return false; - if (unlikely (!dest->serialize (c, *acc.stringIndex, plan.sidmap))) return false; - c->pop_pack (); + c->push (); + if (likely (dest->serialize (c, *acc.stringIndex, plan.sidmap))) + c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } OT::cff1 *cff = c->allocate_min (); @@ -830,16 +875,22 @@ static bool _serialize_cff1 (hb_serialize_context_t *c, /* top dict INDEX */ { /* serialize singleton TopDict */ - c->push (); TopDict *top = c->start_embed (); if (top == nullptr) return false; + c->push (); cff1_top_dict_op_serializer_t topSzr; + unsigned top_size = 0; top_dict_modifiers_t modifier (plan.info, plan.topDictModSIDs); - if (unlikely (!top->serialize (c, plan.topdict_mod, topSzr, modifier))) + if (likely (top->serialize (c, plan.topdict_mod, topSzr, modifier))) + { + top_size = c->length (); + c->pop_pack (false); + } + else + { + c->pop_discard (); return false; - unsigned top_size = c->length (); - c->pop_pack (false); - + } /* serialize INDEX header for above */ CFF1Index *dest = c->start_embed (); if (dest == nullptr) return false; diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index bd7790dc5..a45b0e75e 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -353,42 +353,62 @@ static bool _serialize_cff2 (hb_serialize_context_t *c, if (plan.subset_localsubrs[i].length > 0) { - c->push (); CFF2Subrs *dest = c->start_embed (); if (unlikely (dest == nullptr)) return false; - if (unlikely (!dest->serialize (c, plan.subset_localsubrs[i]))) return false; - subrs_link = c->pop_pack (); + c->push (); + if (likely (dest->serialize (c, plan.subset_localsubrs[i]))) + subrs_link = c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } - c->push (); PrivateDict *pd = c->start_embed (); if (unlikely (pd == nullptr)) return false; - bool result; + c->push (); cff_private_dict_op_serializer_t privSzr (plan.desubroutinize, plan.drop_hints); - result = pd->serialize (c, acc.privateDicts[i], privSzr, subrs_link); - if (unlikely (!result)) return false; - unsigned fd = plan.fdmap[i]; - private_dict_infos[fd].size = c->length (); - private_dict_infos[fd].link = c->pop_pack (); + if (likely (pd->serialize (c, acc.privateDicts[i], privSzr, subrs_link))) + { + unsigned fd = plan.fdmap[i]; + private_dict_infos[fd].size = c->length (); + private_dict_infos[fd].link = c->pop_pack (); + } + else + { + c->pop_discard (); + return false; + } } } /* CharStrings */ { - c->push (); CFF2CharStrings *cs = c->start_embed (); if (unlikely (cs == nullptr)) return false; - if (unlikely (!cs->serialize (c, plan.subset_charstrings))) return false; - plan.info.char_strings_link = c->pop_pack (); + c->push (); + if (likely (cs->serialize (c, plan.subset_charstrings))) + plan.info.char_strings_link = c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } /* FDSelect */ if (acc.fdSelect != &Null(CFF2FDSelect)) { c->push (); - if (unlikely (!hb_serialize_cff_fdselect (c, num_glyphs, *(const FDSelect *)acc.fdSelect, plan.orig_fdcount, - plan.subset_fdselect_format, plan.subset_fdselect_size, - plan.subset_fdselect_ranges))) return false; - plan.info.fd_select.link = c->pop_pack (); + if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *(const FDSelect *)acc.fdSelect, plan.orig_fdcount, + plan.subset_fdselect_format, plan.subset_fdselect_size, + plan.subset_fdselect_ranges))) + plan.info.fd_select.link = c->pop_pack (); + else + { + c->pop_discard (); + return false; + } } /* FDArray (FD Index) */