evas_textblock: prevent segfault if there are no style

```
#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
This commit is contained in:
Ali Alzyod 2020-04-16 15:51:31 +00:00 committed by Stefan Schmidt
parent bc52776fd6
commit 7ac765c71b
2 changed files with 20 additions and 0 deletions

View File

@ -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)
{

View 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);