Avoid div-by-zero, validate upem
diff --git a/src/hb-ot-head-private.hh b/src/hb-ot-head-private.hh
index a3e87a9..56a5861 100644
--- a/src/hb-ot-head-private.hh
+++ b/src/hb-ot-head-private.hh
@@ -42,12 +42,19 @@
{
static const hb_tag_t Tag = HB_OT_TAG_head;
+ inline unsigned int get_upem (void) const {
+ unsigned int upem = unitsPerEm;
+ /* If no valid head table found, assume 1000, which matches typicaly Type1 usage. */
+ return 16 <= upem && upem <= 16384 ? upem : 1000;
+ }
+
inline bool sanitize (hb_sanitize_context_t *c) {
TRACE_SANITIZE ();
/* Shall we check for magicNumber here? Who cares? */
return c->check_struct (this) && likely (version.major == 1);
}
+ private:
FixedVersion version; /* Version of the head table--currently
* 0x00010000 for version 1.0. */
FixedVersion fontRevision; /* Set by font manufacturer. */
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index 8e041ba..c1ae99f 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -77,9 +77,9 @@
} info;
/* Convert from font-space to user-space */
- /* XXX div-by-zero / speed up */
- inline hb_position_t scale_x (int16_t v) { return (int64_t) this->font->x_scale * v / this->face->head_table->unitsPerEm; }
- inline hb_position_t scale_y (int16_t v) { return (int64_t) this->font->y_scale * v / this->face->head_table->unitsPerEm; }
+ /* XXX speed up */
+ inline hb_position_t scale_x (int16_t v) { return (int64_t) this->font->x_scale * v / this->face->head_table->get_upem (); }
+ inline hb_position_t scale_y (int16_t v) { return (int64_t) this->font->y_scale * v / this->face->head_table->get_upem (); }
};