From 7ac765c71b94c1124cb8d672960a12758747cad9 Mon Sep 17 00:00:00 2001 From: Ali Date: Thu, 16 Apr 2020 15:51:31 +0000 Subject: [PATCH] evas_textblock: prevent segfault if there are no style ``` #include EAPI_MAIN int elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) { Evas_Object *win, *textblock; elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); win = elm_win_util_standard_add("", ""); elm_win_autodel_set(win, EINA_TRUE); textblock = evas_object_textblock_add(win); evas_object_resize(textblock, 360, 360); evas_object_show(textblock); evas_object_textblock_text_markup_set(textblock, "b"); evas_object_resize(win, 360, 360); evas_object_show(win); elm_run(); return 0; } ELM_MAIN() ``` this application will crash. Any font format specified in text, if there are now style will cause the crash. Reviewed-by: Mike Blumenkrantz Reviewed-by: Stefan Schmidt Differential Revision: https://phab.enlightenment.org/D11686 --- src/lib/evas/canvas/evas_font_dir.c | 3 +++ src/tests/evas/evas_test_textblock.c | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/lib/evas/canvas/evas_font_dir.c b/src/lib/evas/canvas/evas_font_dir.c index 533993f94a..18367fbb0a 100644 --- a/src/lib/evas/canvas/evas_font_dir.c +++ b/src/lib/evas/canvas/evas_font_dir.c @@ -187,6 +187,9 @@ evas_font_set_get(const char *name) Eina_List *fonts = NULL; char *p; + EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL); + if (!*name) return NULL; + p = strchr(name, ','); if (!p) { diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index d3c575039d..d26b8fc7b9 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -3772,6 +3772,22 @@ EFL_START_TEST(evas_textblock_style) } EFL_END_TEST +/* Textblock functionality without style. */ +EFL_START_TEST(evas_textblock_style_empty) +{ + Evas *evas; + Evas_Object *txt; + Evas_Coord w, h; + evas = EVAS_TEST_INIT_EVAS(); + txt = evas_object_textblock_add(evas); + evas_object_textblock_text_markup_set(txt, ""); + evas_object_textblock_size_formatted_get(txt, &w, &h); + ck_assert_int_eq(w, 0); + ck_assert_int_eq(h, 0); + evas_free(evas); +} +EFL_END_TEST + /* Basic test for style user push/peek/pop. */ EFL_START_TEST(evas_textblock_style_user) { @@ -5045,6 +5061,7 @@ void evas_test_textblock(TCase *tc) tcase_add_test(tc, evas_textblock_size); tcase_add_test(tc, evas_textblock_editing); tcase_add_test(tc, evas_textblock_style); + tcase_add_test(tc, evas_textblock_style_empty); tcase_add_test(tc, evas_textblock_style_user); tcase_add_test(tc, evas_textblock_evas); tcase_add_test(tc, evas_textblock_text_getters);