jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=2b8e74e623c33c1f218f7eec6d3ff6eea2d2b09d

commit 2b8e74e623c33c1f218f7eec6d3ff6eea2d2b09d
Author: Jean-Philippe Andre <[email protected]>
Date:   Tue Oct 29 19:45:13 2013 +0900

    evas/cserve2: Fix crash in server when an image file changes
    
    Since cserve2 uses inotify to track image file updates,
    it will drop its references to a specific file and all
    the associated images.
    Fix some logic in the deletion code.
---
 src/bin/evas/evas_cserve2_cache.c | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/bin/evas/evas_cserve2_cache.c 
b/src/bin/evas/evas_cserve2_cache.c
index 4c20a72..4322be2 100644
--- a/src/bin/evas/evas_cserve2_cache.c
+++ b/src/bin/evas/evas_cserve2_cache.c
@@ -1075,9 +1075,12 @@ _image_entry_free(Image_Entry *ientry)
    if (fd)
      {
         fentry = _file_entry_find(fd->id);
-        fentry->images = eina_list_remove(fentry->images, ientry);
-        if (fentry && !fentry->images && !ASENTRY(fentry)->references)
-          eina_hash_del_by_key(file_entries, &fd->id);
+        if (fentry)
+          {
+             fentry->images = eina_list_remove(fentry->images, ientry);
+             if (!fentry->images && !ASENTRY(fentry)->references)
+               eina_hash_del_by_key(file_entries, &fd->id);
+          }
      }
    else
       ERR("Could not find file data %u for image %u",
@@ -1669,18 +1672,14 @@ static void
 _file_changed_cb(const char *path EINA_UNUSED, Eina_Bool deleted EINA_UNUSED, 
void *data)
 {
    File_Watch *fw = data;
-   File_Data *fd;
+   File_Entry *fentry;
    Eina_List *l;
 
-   EINA_LIST_FOREACH(fw->entries, l, fd)
+   EINA_LIST_FOREACH(fw->entries, l, fentry)
      {
         Eina_List *ll;
         Image_Entry *ie;
-        File_Entry *fentry;
-
-        fd->invalid = EINA_TRUE;
-        fentry = _file_entry_find(fd->id);
-        if (!fentry) continue;
+        File_Data *fd;
 
         fentry->watcher = NULL;
 
@@ -1688,13 +1687,13 @@ _file_changed_cb(const char *path EINA_UNUSED, 
Eina_Bool deleted EINA_UNUSED, vo
           {
              Image_Data *idata;
 
+             idata = _image_data_find(ENTRYID(ie));
              eina_hash_set(image_entries, &ENTRYID(ie), NULL);
              if (ASENTRY(ie)->request /*&& !ie->base.request->processing*/)
                cserve2_request_cancel_all(ASENTRY(ie)->request,
                                           CSERVE2_FILE_CHANGED);
              ASENTRY(ie)->request = NULL;
 
-             idata = _image_data_find(ENTRYID(ie));
              if (idata)
                {
                   _image_id_free(idata);
@@ -1703,8 +1702,15 @@ _file_changed_cb(const char *path EINA_UNUSED, Eina_Bool 
deleted EINA_UNUSED, vo
                }
           }
 
-        _file_id_free(fd);
-        eina_hash_set(file_entries, &fd->id, NULL);
+
+        fd = _file_data_find(ENTRYID(fentry));
+        if (fd)
+          {
+             fd->invalid = EINA_TRUE;
+             _file_id_free(fd);
+             eina_hash_set(file_entries, &fd->id, NULL);
+          }
+
         if (ASENTRY(fentry)->request
             /*&& !ASENTRY(fentry)->request->processing*/)
           {

-- 


Reply via email to