raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=7d36abad25e102b2e09e49ff5000906673b046f5

commit 7d36abad25e102b2e09e49ff5000906673b046f5
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Mon Apr 20 21:46:23 2015 +0900

    eio - fix crashes due to stale eio files in tracking list
    
    so eio_eet didnt free fiels the same as the rest of eio. it thought it
    was special. it thought it could just go free() it's objects (even
    though they inherit the core Eio_File object type in their structs).
    everyone else ended up calling eio_file_free() EXCEPT eio_eet. so the
    eio_(long)_file_set() funcs ewnded up adding this eio file to the
    tracking list via eio_file_register() but never unregistered because
    they really liked to just do their own thing anyway...
    
    BAD CEDRIC! SPANKING TIME
    
    
http://33.media.tumblr.com/3422c76c33c3b9b045f623ff73e0bf8d/tumblr_mhvu61N9br1rbavngo1_500.gi
    
    so this unifies all allocation to now use a single allocator (that
    also ensures all eio async io objects are zero'd out), and a SINGLE
    free path, and then it all works. no more valgrind complaints on e
    shutdown/restart whilst eio "things" were used before or ... maybe
    still around.
    
    this should fix T2129
    
    so try again "git master" after this commit.
    
    @fix
---
 src/lib/eio/eio_eet.c     | 26 +++++++++++++-------------
 src/lib/eio/eio_file.c    | 10 +++++-----
 src/lib/eio/eio_main.c    | 12 ++++++++++++
 src/lib/eio/eio_private.h |  3 +++
 src/lib/eio/eio_single.c  | 14 +++++++-------
 5 files changed, 40 insertions(+), 25 deletions(-)

diff --git a/src/lib/eio/eio_eet.c b/src/lib/eio/eio_eet.c
index d14c3f3..29b3d74 100644
--- a/src/lib/eio/eio_eet.c
+++ b/src/lib/eio/eio_eet.c
@@ -43,7 +43,7 @@ static void
 _eio_eet_open_free(Eio_Eet_Open *eet)
 {
    if (eet->filename) eina_stringshare_del(eet->filename);
-   free(eet);
+   eio_file_free((Eio_File *)eet);
 }
 
 static void
@@ -88,7 +88,7 @@ _eio_eet_simple_end(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    Eio_Eet_Simple *eet = data;
 
    eet->common.done_cb((void*) eet->common.data, &eet->common);
-   free(eet);
+   eio_file_free((Eio_File *)eet);
 }
 
 static void
@@ -97,7 +97,7 @@ _eio_eet_simple_cancel(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    Eio_Eet_Simple *eet = data;
 
    eet->error_cb((void*) eet->common.data, &eet->common, eet->error);
-   free(eet);
+   eio_file_free((Eio_File *)eet);
 }
 
 static void
@@ -117,7 +117,7 @@ _eio_eet_write_cipher_free(Eio_Eet_Write *ew)
 {
    eina_stringshare_del(ew->name);
    eina_stringshare_del(ew->cipher_key);
-   free(ew);
+   eio_file_free((Eio_File *)ew);
 }
 
 static void
@@ -320,7 +320,7 @@ eio_eet_open(const char *filename,
    EINA_SAFETY_ON_NULL_RETURN_VAL(eet_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   eet = malloc(sizeof (Eio_Eet_Open));
+   eet = eio_common_alloc(sizeof(Eio_Eet_Open));
    EINA_SAFETY_ON_NULL_RETURN_VAL(eet, NULL);
 
    eet->eet_cb = eet_cb;
@@ -351,7 +351,7 @@ eio_eet_close(Eet_File *ef,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   eet = malloc(sizeof (Eio_Eet_Simple));
+   eet = eio_common_alloc(sizeof(Eio_Eet_Simple));
    EINA_SAFETY_ON_NULL_RETURN_VAL(eet, NULL);
 
    eet->ef = ef;
@@ -381,7 +381,7 @@ eio_eet_flush(Eet_File *ef,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   eet = malloc(sizeof (Eio_Eet_Simple));
+   eet = eio_common_alloc(sizeof(Eio_Eet_Simple));
    EINA_SAFETY_ON_NULL_RETURN_VAL(eet, NULL);
 
    eet->ef = ef;
@@ -427,7 +427,7 @@ eio_eet_data_write_cipher(Eet_File *ef,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   ew = malloc(sizeof (Eio_Eet_Write));
+   ew = eio_common_alloc(sizeof(Eio_Eet_Write));
    EINA_SAFETY_ON_NULL_RETURN_VAL(ew, NULL);
 
    ew->ef = ef;
@@ -467,7 +467,7 @@ eio_eet_data_read_cipher(Eet_File *ef,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   er = malloc(sizeof (Eio_Eet_Read));
+   er = eio_common_alloc(sizeof(Eio_Eet_Read));
    EINA_SAFETY_ON_NULL_RETURN_VAL(er, NULL);
 
    er->ef = ef;
@@ -510,7 +510,7 @@ eio_eet_data_image_write_cipher(Eet_File *ef,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   eiw = malloc(sizeof (Eio_Eet_Image_Write));
+   eiw = eio_common_alloc(sizeof(Eio_Eet_Image_Write));
    EINA_SAFETY_ON_NULL_RETURN_VAL(eiw, NULL);
 
    eiw->ef = ef;
@@ -551,7 +551,7 @@ eio_eet_read_direct(Eet_File *ef,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   er = malloc(sizeof (Eio_Eet_Read));
+   er = eio_common_alloc(sizeof(Eio_Eet_Read));
    EINA_SAFETY_ON_NULL_RETURN_VAL(er, NULL);
 
    er->ef = ef;
@@ -587,7 +587,7 @@ eio_eet_read_cipher(Eet_File *ef,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   er = malloc(sizeof (Eio_Eet_Read));
+   er = eio_common_alloc(sizeof(Eio_Eet_Read));
    EINA_SAFETY_ON_NULL_RETURN_VAL(er, NULL);
 
    er->ef = ef;
@@ -625,7 +625,7 @@ eio_eet_write_cipher(Eet_File *ef,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   ew = malloc(sizeof (Eio_Eet_Write));
+   ew = eio_common_alloc(sizeof(Eio_Eet_Write));
    EINA_SAFETY_ON_NULL_RETURN_VAL(ew, NULL);
 
    ew->ef = ef;
diff --git a/src/lib/eio/eio_file.c b/src/lib/eio/eio_file.c
index 7a104f4..e651eac 100644
--- a/src/lib/eio/eio_file.c
+++ b/src/lib/eio/eio_file.c
@@ -505,7 +505,7 @@ eio_file_ls(const char *dir,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   async = calloc(1, sizeof (Eio_File_Char_Ls));
+   async = eio_common_alloc(sizeof(Eio_File_Char_Ls));
    EINA_SAFETY_ON_NULL_RETURN_VAL(async, NULL);
 
    async->filter_cb = filter_cb;
@@ -540,7 +540,7 @@ eio_file_direct_ls(const char *dir,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   async = calloc(1, sizeof(Eio_File_Direct_Ls));
+   async = eio_common_alloc(sizeof(Eio_File_Direct_Ls));
    EINA_SAFETY_ON_NULL_RETURN_VAL(async, NULL);
 
    async->filter_cb = filter_cb;
@@ -575,7 +575,7 @@ eio_file_stat_ls(const char *dir,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   async = calloc(1, sizeof(Eio_File_Direct_Ls));
+   async = eio_common_alloc(sizeof(Eio_File_Direct_Ls));
    EINA_SAFETY_ON_NULL_RETURN_VAL(async, NULL);
 
    async->filter_cb = filter_cb;
@@ -679,7 +679,7 @@ eio_file_copy(const char *source,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   copy = malloc(sizeof(Eio_File_Progress));
+   copy = eio_common_alloc(sizeof(Eio_File_Progress));
    EINA_SAFETY_ON_NULL_RETURN_VAL(copy, NULL);
 
    copy->op = EIO_FILE_COPY;
@@ -715,7 +715,7 @@ eio_file_move(const char *source,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   move = malloc(sizeof(Eio_File_Move));
+   move = eio_common_alloc(sizeof(Eio_File_Move));
    EINA_SAFETY_ON_NULL_RETURN_VAL(move, NULL);
 
    move->progress.op = EIO_FILE_MOVE;
diff --git a/src/lib/eio/eio_main.c b/src/lib/eio/eio_main.c
index f084cb7..a22e515 100644
--- a/src/lib/eio/eio_main.c
+++ b/src/lib/eio/eio_main.c
@@ -233,6 +233,18 @@ eio_pack_send(Ecore_Thread *thread, Eina_List *pack, 
double *start)
    return pack;
 }
 
+void *
+eio_common_alloc(size_t size)
+{
+   return calloc(1, size);
+}
+
+void
+eio_common_free(Eio_File *common)
+{
+   free(common);
+}
+
 // For now use a list for simplicity and we should not have that many
 // pending request
 static Eina_List *tracked_thread = NULL;
diff --git a/src/lib/eio/eio_private.h b/src/lib/eio/eio_private.h
index b36360d..6d58f9f 100644
--- a/src/lib/eio/eio_private.h
+++ b/src/lib/eio/eio_private.h
@@ -498,6 +498,9 @@ void eio_async_error(void *data, Ecore_Thread *thread);
 
 Eina_List *eio_pack_send(Ecore_Thread *thread, Eina_List *pack, double *start);
 
+void *eio_common_alloc(size_t size);
+void eio_common_free(Eio_File *common);
+
 void eio_file_register(Eio_File *common);
 void eio_file_unregister(Eio_File *common);
 
diff --git a/src/lib/eio/eio_single.c b/src/lib/eio/eio_single.c
index 1607cf3..f47c183 100644
--- a/src/lib/eio/eio_single.c
+++ b/src/lib/eio/eio_single.c
@@ -327,7 +327,7 @@ eio_file_free(Eio_File *common)
    if (common->main.associated)
      eina_hash_free(common->main.associated);
    eio_file_unregister(common);
-   free(common);
+   eio_common_free(common);
 }
 
 Eina_Bool
@@ -428,7 +428,7 @@ eio_file_direct_stat(const char *path,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   s = malloc(sizeof (Eio_File_Stat));
+   s = eio_common_alloc(sizeof (Eio_File_Stat));
    if (!s) return NULL;
 
    s->path = eina_stringshare_add(path);
@@ -460,7 +460,7 @@ eio_file_direct_lstat(const char *path,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   s = malloc(sizeof (Eio_File_Stat));
+   s = eio_common_alloc(sizeof (Eio_File_Stat));
    if (!s) return NULL;
 
    s->path = eina_stringshare_add(path);
@@ -490,7 +490,7 @@ eio_file_unlink(const char *path,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   l = malloc(sizeof (Eio_File_Unlink));
+   l = eio_common_alloc(sizeof (Eio_File_Unlink));
    if (!l) return NULL;
 
    l->path = eina_stringshare_add(path);
@@ -520,7 +520,7 @@ eio_file_mkdir(const char *path,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   r = malloc(sizeof (Eio_File_Mkdir));
+   r = eio_common_alloc(sizeof (Eio_File_Mkdir));
    if (!r) return NULL;
 
    r->path = eina_stringshare_add(path);
@@ -551,7 +551,7 @@ eio_file_chmod(const char *path,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   r = malloc(sizeof (Eio_File_Mkdir));
+   r = eio_common_alloc(sizeof (Eio_File_Mkdir));
    if (!r) return NULL;
 
    r->path = eina_stringshare_add(path);
@@ -583,7 +583,7 @@ eio_file_chown(const char *path,
    EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL);
 
-   c = malloc(sizeof (Eio_File_Chown));
+   c = eio_common_alloc(sizeof (Eio_File_Chown));
    if (!c) return NULL;
 
    c->path = eina_stringshare_add(path);

-- 


Reply via email to