[shape] Fail shaping internally if buffer ops exceeded

pull/3432/head
Behdad Esfahbod 2 years ago
parent 5a058ba158
commit e246723f0c
  1. 2
      src/hb-buffer.cc
  2. 2
      src/hb-ot-shape.cc
  3. 10
      src/hb-shape.cc

@ -311,6 +311,7 @@ hb_buffer_t::enter ()
{
deallocate_var_all ();
serial = 0;
shaping_failed = false;
scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_LEN_FACTOR)))
{
@ -330,6 +331,7 @@ hb_buffer_t::leave ()
max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
deallocate_var_all ();
serial = 0;
// Intentionally not reseting shaping_failed, such that it can be inspected.
}

@ -1159,8 +1159,6 @@ hb_propagate_flags (hb_buffer_t *buffer)
static void
hb_ot_shape_internal (hb_ot_shape_context_t *c)
{
c->buffer->enter ();
/* Save the original direction, we use it later. */
c->target_direction = c->buffer->props.direction;

@ -129,6 +129,8 @@ hb_shape_full (hb_font_t *font,
if (unlikely (!buffer->len))
return true;
buffer->enter ();
hb_buffer_t *text_buffer = nullptr;
if (buffer->flags & HB_BUFFER_FLAG_VERIFY)
{
@ -140,8 +142,12 @@ hb_shape_full (hb_font_t *font,
features, num_features,
font->coords, font->num_coords,
shaper_list);
buffer->shaping_failed = false;
hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
if (buffer->max_ops <= 0)
buffer->shaping_failed = true;
hb_shape_plan_destroy (shape_plan);
if (text_buffer)
@ -157,6 +163,8 @@ hb_shape_full (hb_font_t *font,
hb_buffer_destroy (text_buffer);
}
buffer->leave ();
return res;
}

Loading…
Cancel
Save