diff --git a/src/core/lv_obj.c b/src/core/lv_obj.c index 8583c73122..6f2a1d469a 100644 --- a/src/core/lv_obj.c +++ b/src/core/lv_obj.c @@ -307,15 +307,20 @@ void lv_obj_remove_flag(lv_obj_t * obj, lv_obj_flag_t f) } obj->flags &= (~f); + lv_obj_t * parent = lv_obj_get_parent(obj); if(f & LV_OBJ_FLAG_HIDDEN) { lv_obj_invalidate(obj); - lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + if(parent) { + lv_obj_mark_layout_as_dirty(parent); + } lv_obj_mark_layout_as_dirty(obj); } if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { - lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + if(parent) { + lv_obj_mark_layout_as_dirty(parent); + } } } diff --git a/tests/src/test_cases/widgets/test_obj_flags.c b/tests/src/test_cases/widgets/test_obj_flags.c index 6f3dcb25c7..329d8aff37 100644 --- a/tests/src/test_cases/widgets/test_obj_flags.c +++ b/tests/src/test_cases/widgets/test_obj_flags.c @@ -237,4 +237,14 @@ void test_obj_flag_radio_button(void) } +void test_obj_flag_parent_hidden(void) +{ + /* #10083: Ensure that adding and removing screen flags don't make lvgl crash*/ + lv_obj_add_flag(lv_screen_active(), LV_OBJ_FLAG_HIDDEN); + TEST_ASSERT_TRUE(lv_obj_has_flag(lv_screen_active(), LV_OBJ_FLAG_HIDDEN)); + lv_obj_remove_flag(lv_screen_active(), LV_OBJ_FLAG_HIDDEN); + TEST_ASSERT_FALSE(lv_obj_has_flag(lv_screen_active(), LV_OBJ_FLAG_HIDDEN)); + TEST_PASS(); +} + #endif