[unicode] Destroy user_data in set_funcs fail paths

This is what the font_funcs / draw_funcs do.
This commit is contained in:
Behdad Esfahbod 2022-11-19 15:19:08 -07:00
parent 56d6b6992b
commit 527823ccac
2 changed files with 15 additions and 3 deletions

View File

@ -377,7 +377,14 @@ hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \
hb_destroy_func_t destroy) \
{ \
if (hb_object_is_immutable (ufuncs)) \
return; \
goto fail; \
\
if (!func && destroy) \
{ \
destroy (user_data); \
destroy = nullptr; \
user_data = nullptr; \
} \
\
if (ufuncs->destroy.name) \
ufuncs->destroy.name (ufuncs->user_data.name); \
@ -391,6 +398,11 @@ hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \
ufuncs->user_data.name = ufuncs->parent->user_data.name; \
ufuncs->destroy.name = nullptr; \
} \
return; \
\
fail: \
if (destroy) \
destroy (user_data); \
}
HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS

View File

@ -754,9 +754,9 @@ test_unicode_setters (void)
/* Since uf is immutable now, the following setter should do nothing. */
p->func_setter (uf, (get_func_t) a_is_for_arabic_get_script, &data[1], free_up);
g_assert (data[0].freed && !data[1].freed);
g_assert (data[0].freed && data[1].freed);
hb_unicode_funcs_destroy (uf);
g_assert (data[0].freed && !data[1].freed);
g_assert (data[0].freed && data[1].freed);
}
}