diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index b778abba8..867438a90 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -365,8 +365,12 @@ hb_buffer_t::move_to (unsigned int i) { assert (i <= len); idx = i; + return true; } - else if (out_len < i) + + assert (i <= out_len + (len - idx)); + + if (out_len < i) { unsigned int count = i - out_len; if (unlikely (!make_room_for (count, count))) return false; @@ -388,6 +392,7 @@ hb_buffer_t::move_to (unsigned int i) out_len -= count; memmove (info + idx, out_info + out_len, count * sizeof (out_info[0])); } + return true; } diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 5366550ae..fde6eaee5 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -1031,7 +1031,8 @@ static inline bool apply_lookup (hb_apply_context_t *c, /* Recursed lookup changed buffer len. Adjust. */ - end += delta; + /* end can't go back past the current match position. */ + end = MAX ((int) match_positions[idx] + 1, int (end) + delta); unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */