evas_textblock: prevent segfault if there are no style
authorAli <ali198724@gmail.com>
Thu, 16 Apr 2020 15:51:31 +0000 (15:51 +0000)
committerJongmin Lee <jm105.lee@samsung.com>
Fri, 17 Apr 2020 22:25:15 +0000 (07:25 +0900)
```
#include <Elementary.h>

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>b</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 <michael.blumenkrantz@gmail.com>
Reviewed-by: Stefan Schmidt <stefan@datenfreihafen.org>
Differential Revision: https://phab.enlightenment.org/D11686

src/lib/evas/canvas/evas_font_dir.c
src/tests/evas/evas_test_textblock.c

index a3e28d6..5561020 100644 (file)
@@ -201,6 +201,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)
      {
index d3c5750..d26b8fc 100644 (file)
@@ -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, "<b></b>");
+   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);