[iter] Fix mystery crash
Fuzzer caught it: ==14==ERROR: AddressSanitizer: stack-use-after-return on address 0x7fca2ed7a3e0 at pc 0x0000006057aa bp 0x7ffc3290f1d0 sp 0x7ffc3290f1c8 READ of size 4 at 0x7fca2ed7a3e0 thread T0 SCARINESS: 55 (4-byte-read-stack-use-after-return) #0 0x6057a9 in OT::SingleSubstFormat2::subset(hb_subset_context_t*) const /src/harfbuzz/src/./hb-ot-layout-gsub-table.hh:194:40 #1 0x5ff921 in hb_subset_context_t::return_t OT::SingleSubst::dispatch<hb_subset_context_t>(hb_subset_context_t*) const /src/harfbuzz/src/./hb-ot-layout-gsub-table.hh:256:13 I can't reproduce locally, but many of the bots are failing because of this as well. It's a pity that operator-> must return pointer. Ugh. Why?!
This commit is contained in:
parent
2e675d49f2
commit
2d940946d5
|
@ -71,6 +71,10 @@ struct hb_iter_t
|
||||||
iter_t operator + () const { return *thiz(); }
|
iter_t operator + () const { return *thiz(); }
|
||||||
explicit_operator bool () const { return thiz()->__more__ (); }
|
explicit_operator bool () const { return thiz()->__more__ (); }
|
||||||
unsigned len () const { return thiz()->__len__ (); }
|
unsigned len () const { return thiz()->__len__ (); }
|
||||||
|
/* The following can only be enabled if item_t is reference type. Otherwise
|
||||||
|
* it will be returning pointer to temporary rvalue. */
|
||||||
|
template <typename T = item_t,
|
||||||
|
hb_enable_if (hb_is_reference (T))>
|
||||||
hb_remove_reference (item_t)* operator -> () const { return hb_addressof (**thiz()); }
|
hb_remove_reference (item_t)* operator -> () const { return hb_addressof (**thiz()); }
|
||||||
item_t operator * () const { return thiz()->__item__ (); }
|
item_t operator * () const { return thiz()->__item__ (); }
|
||||||
item_t operator [] (unsigned i) const { return thiz()->__item_at__ (i); }
|
item_t operator [] (unsigned i) const { return thiz()->__item_at__ (i); }
|
||||||
|
|
|
@ -191,8 +191,8 @@ struct SingleSubstFormat2
|
||||||
for (auto it = hb_zip (this+coverage, substitute)
|
for (auto it = hb_zip (this+coverage, substitute)
|
||||||
| hb_filter (glyphset, hb_first); it; ++it)
|
| hb_filter (glyphset, hb_first); it; ++it)
|
||||||
{
|
{
|
||||||
from.push ()->set (glyph_map[it->first]);
|
from.push ()->set (glyph_map[(*it).first]);
|
||||||
to.push ()->set (glyph_map[it->second]);
|
to.push ()->set (glyph_map[(*it).second]);
|
||||||
}
|
}
|
||||||
c->serializer->propagate_error (from, to);
|
c->serializer->propagate_error (from, to);
|
||||||
SingleSubst_serialize (c->serializer, from, to);
|
SingleSubst_serialize (c->serializer, from, to);
|
||||||
|
|
Loading…
Reference in New Issue