[OT] Really fix possible NULL dereference this time

This commit is contained in:
Behdad Esfahbod 2012-09-04 14:55:00 -04:00
parent 2941683358
commit a5ddd9e31c
3 changed files with 10 additions and 8 deletions

View File

@ -86,13 +86,13 @@ struct hb_would_apply_context_t
const hb_codepoint_t *glyphs_, const hb_codepoint_t *glyphs_,
unsigned int len_, unsigned int len_,
bool zero_context_, bool zero_context_,
const hb_set_digest_t *digest_ const hb_set_digest_t &digest_
) : ) :
face (face_), face (face_),
glyphs (glyphs_), glyphs (glyphs_),
len (len_), len (len_),
zero_context (zero_context_), zero_context (zero_context_),
digest (digest_ ? *digest_ : hb_set_digest_t()), digest (digest_),
debug_depth (0) {}; debug_depth (0) {};
}; };
@ -124,7 +124,7 @@ struct hb_apply_context_t
hb_apply_context_t (hb_font_t *font_, hb_apply_context_t (hb_font_t *font_,
hb_buffer_t *buffer_, hb_buffer_t *buffer_,
hb_mask_t lookup_mask_, hb_mask_t lookup_mask_,
const hb_set_digest_t *digest_) : const hb_set_digest_t &digest_) :
font (font_), face (font->face), buffer (buffer_), font (font_), face (font->face), buffer (buffer_),
direction (buffer_->props.direction), direction (buffer_->props.direction),
lookup_mask (lookup_mask_), lookup_mask (lookup_mask_),
@ -132,7 +132,7 @@ struct hb_apply_context_t
lookup_props (0), property (0), debug_depth (0), lookup_props (0), property (0), debug_depth (0),
gdef (*hb_ot_layout_from_face (face)->gdef), gdef (*hb_ot_layout_from_face (face)->gdef),
has_glyph_classes (gdef.has_glyph_classes ()), has_glyph_classes (gdef.has_glyph_classes ()),
digest (*digest_) {} digest (digest_) {}
void set_lookup_props (unsigned int lookup_props_) { void set_lookup_props (unsigned int lookup_props_) {
lookup_props = lookup_props_; lookup_props = lookup_props_;

View File

@ -417,7 +417,7 @@ hb_ot_layout_would_substitute_lookup_fast (hb_face_t *face,
hb_bool_t zero_context) hb_bool_t zero_context)
{ {
if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false; if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false;
OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, zero_context, &hb_ot_layout_from_face (face)->gsub_digests[lookup_index]); OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, zero_context, hb_ot_layout_from_face (face)->gsub_digests[lookup_index]);
return hb_ot_layout_from_face (face)->gsub->would_substitute_lookup (&c, lookup_index); return hb_ot_layout_from_face (face)->gsub->would_substitute_lookup (&c, lookup_index);
} }
@ -434,7 +434,7 @@ hb_ot_layout_substitute_lookup (hb_font_t *font,
hb_mask_t mask) hb_mask_t mask)
{ {
if (unlikely (lookup_index >= hb_ot_layout_from_face (font->face)->gsub_lookup_count)) return false; if (unlikely (lookup_index >= hb_ot_layout_from_face (font->face)->gsub_lookup_count)) return false;
OT::hb_apply_context_t c (font, buffer, mask, &hb_ot_layout_from_face (font->face)->gsub_digests[lookup_index]); OT::hb_apply_context_t c (font, buffer, mask, hb_ot_layout_from_face (font->face)->gsub_digests[lookup_index]);
return hb_ot_layout_from_face (font->face)->gsub->substitute_lookup (&c, lookup_index); return hb_ot_layout_from_face (font->face)->gsub->substitute_lookup (&c, lookup_index);
} }
@ -476,7 +476,7 @@ hb_ot_layout_position_lookup (hb_font_t *font,
hb_mask_t mask) hb_mask_t mask)
{ {
if (unlikely (lookup_index >= hb_ot_layout_from_face (font->face)->gpos_lookup_count)) return false; if (unlikely (lookup_index >= hb_ot_layout_from_face (font->face)->gpos_lookup_count)) return false;
OT::hb_apply_context_t c (font, buffer, mask, &hb_ot_layout_from_face (font->face)->gpos_digests[lookup_index]); OT::hb_apply_context_t c (font, buffer, mask, hb_ot_layout_from_face (font->face)->gpos_digests[lookup_index]);
return hb_ot_layout_from_face (font->face)->gpos->position_lookup (&c, lookup_index); return hb_ot_layout_from_face (font->face)->gpos->position_lookup (&c, lookup_index);
} }

View File

@ -246,7 +246,9 @@ arabic_fallback_shape (hb_font_t *font, hb_buffer_t *buffer)
buffer->info[i].codepoint = shaped; buffer->info[i].codepoint = shaped;
} }
OT::hb_apply_context_t c (font, buffer, 1/*global mask*/, NULL); hb_set_digest_t digest;
digest.init ();
OT::hb_apply_context_t c (font, buffer, 1/*global mask*/, digest);
c.set_lookup_props (OT::LookupFlag::IgnoreMarks); c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
/* Mandatory ligatures */ /* Mandatory ligatures */