diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index c1795dc7f..54c46692c 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -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 diff --git a/test/api/test-unicode.c b/test/api/test-unicode.c index 4ec718b8f..857308b33 100644 --- a/test/api/test-unicode.c +++ b/test/api/test-unicode.c @@ -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); } }