From 9632a6ef4e9d849cde67992bbd116300437a8748 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Sun, 10 Jun 2012 07:53:43 +0000 Subject: [PATCH] Eo: Added a check if object is already deleted in eo_unref. If an object is manually freed it was possible to ref/unref it so it'll try to call the destructor again. SVN revision: 71890 --- legacy/eobj/lib/eo.c | 6 ++++++ legacy/eobj/tests/eo_test_general.c | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/legacy/eobj/lib/eo.c b/legacy/eobj/lib/eo.c index fcfbfdfb04..823f3445ec 100644 --- a/legacy/eobj/lib/eo.c +++ b/legacy/eobj/lib/eo.c @@ -1294,6 +1294,12 @@ _eo_unref(Eo *obj) { if (--(obj->refcount) == 0) { + if (obj->del) + { + ERR("Object %p already deleted.", obj); + return; + } + _eo_del_internal(obj); #ifndef NDEBUG diff --git a/legacy/eobj/tests/eo_test_general.c b/legacy/eobj/tests/eo_test_general.c index 12f79dd06a..30a5cb6f65 100644 --- a/legacy/eobj/tests/eo_test_general.c +++ b/legacy/eobj/tests/eo_test_general.c @@ -181,6 +181,15 @@ START_TEST(eo_man_free) eo_manual_free(obj); eo_unref(obj); + obj = eo_add(klass, NULL); + fail_if(!obj); + eo_manual_free_set(obj, EINA_TRUE); + eo_unref(obj); + eo_ref(obj); + eo_unref(obj); + eo_unref(obj); + eo_manual_free(obj); + eo_shutdown(); } END_TEST