genlist: clear 'rel' pointer when it becomes unused during del_pre_hook.

If we're walking an item and it's deleted, the memory won't go away
immediately in _item_del_pre_hook() as would in _item_del(), then it's
not enough to remove ourselves from the reverse-relative list of the
item we were relative to, we also need to clean our own relative
pointer so we won't touch it later when the item is not being walked
anymore and _item_del() is called.

I was getting this annoying error with espionage application, opening
an interface of an object and then closing the window or selecting
another bus name (whatever would call elm_genlist_clear()).

During the clear process genlist will flag the next item as "walking"
so it's not gone when the current item dies (would happen if next item
is a subitem). The item would run _item_del_pre_hook() but not
_item_del(), but on the next loop iteration the next item would be the
current, then not walking anymore and during _item_del() it would
access it->item->rel which would point to the now-dead item.
This commit is contained in:
Gustavo Sverzut Barbieri 2013-11-28 20:42:16 -02:00
parent 877abee7fe
commit 085e644c49
1 changed files with 5 additions and 2 deletions

View File

@ -5260,8 +5260,11 @@ _item_del_pre_hook(Elm_Object_Item *item)
{
// FIXME: relative will be better to be fixed. it is too harsh.
if (it->item->rel)
it->item->rel->item->rel_revs =
eina_list_remove(it->item->rel->item->rel_revs, it);
{
it->item->rel->item->rel_revs =
eina_list_remove(it->item->rel->item->rel_revs, it);
it->item->rel = NULL;
}
if (it->item->rel_revs)
{
Elm_Gen_Item *tmp;