From 3ab7d2649bf5c92d3837b3132d65d4659d0fa003 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 14 Feb 2018 15:48:57 -0800 Subject: [PATCH] [subset] Fix memory leak in hb-ot-{maxp,os2}. Plus some formatting. --- src/hb-ot-maxp-table.hh | 6 ++++-- src/hb-ot-os2-table.hh | 24 +++++++++++++----------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/hb-ot-maxp-table.hh b/src/hb-ot-maxp-table.hh index 0ad123ab9..ceb83628c 100644 --- a/src/hb-ot-maxp-table.hh +++ b/src/hb-ot-maxp-table.hh @@ -64,7 +64,7 @@ struct maxp inline bool subset (hb_subset_plan_t *plan) const { hb_blob_t *maxp_blob = OT::Sanitizer().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_maxp)); - // TODO hb_blob_copy_writable_or_fail + // TODO(grieger): hb_blob_copy_writable_or_fail hb_blob_t *maxp_prime_blob = hb_blob_create_sub_blob (maxp_blob, 0, -1); hb_blob_destroy (maxp_blob); @@ -76,7 +76,9 @@ struct maxp maxp_prime->set_num_glyphs (plan->gids_to_retain_sorted.len); - return hb_subset_plan_add_table(plan, HB_OT_TAG_maxp, maxp_prime_blob); + bool result = hb_subset_plan_add_table(plan, HB_OT_TAG_maxp, maxp_prime_blob); + hb_blob_destroy (maxp_prime_blob); + return result; } /* We only implement version 0.5 as none of the extra fields in version 1.0 are useful. */ diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh index 9bc75c0c0..18dc4ab07 100644 --- a/src/hb-ot-os2-table.hh +++ b/src/hb-ot-os2-table.hh @@ -53,6 +53,7 @@ struct os2 { hb_blob_t *os2_blob = OT::Sanitizer().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_os2)); hb_blob_t *os2_prime_blob = hb_blob_create_sub_blob (os2_blob, 0, -1); + // TODO(grieger): move to hb_blob_copy_writable_or_fail hb_blob_destroy (os2_blob); OT::os2 *os2_prime = (OT::os2 *) hb_blob_get_data_writable (os2_prime_blob, nullptr); @@ -62,27 +63,28 @@ struct os2 } uint16_t min_cp, max_cp; - find_min_and_max_codepoint (plan, &min_cp, &max_cp); + find_min_and_max_codepoint (plan->codepoints, &min_cp, &max_cp); os2_prime->usFirstCharIndex.set (min_cp); os2_prime->usLastCharIndex.set (max_cp); - return hb_subset_plan_add_table(plan, HB_OT_TAG_os2, os2_prime_blob); + bool result = hb_subset_plan_add_table(plan, HB_OT_TAG_os2, os2_prime_blob); + hb_blob_destroy (os2_prime_blob); + return result; } - static inline void find_min_and_max_codepoint (hb_subset_plan_t *plan, - uint16_t *min_cp, /* OUT */ - uint16_t *max_cp /* OUT */) + static inline void find_min_and_max_codepoint (const hb_prealloced_array_t &codepoints, + uint16_t *min_cp, /* OUT */ + uint16_t *max_cp /* OUT */) { hb_codepoint_t min = -1, max = 0; - for (int i = 0; i < plan->codepoints.len; i++) { - hb_codepoint_t cp = plan->codepoints[i]; - if (cp < min) { + for (int i = 0; i < codepoints.len; i++) + { + hb_codepoint_t cp = codepoints[i]; + if (cp < min) min = cp; - } - if (cp > max) { + if (cp > max) max = cp; - } } if (min > 0xFFFF)