ecore_file_monitor: replace EINA_LIST_FOREACH to EINA_LIST_FOREACH_SAFE 90/167790/2
authorWooHyun Jung <wh0705.jung@samsung.com>
Mon, 15 Jan 2018 04:54:01 +0000 (13:54 +0900)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Mon, 5 Feb 2018 02:00:47 +0000 (02:00 +0000)
If ecore_file_monitor_del is called inside the file monitor callback function,
eina_list found from monitor_hash would be freed. (You can check this inside
eina_hash_list_remove.)
Then, EINA_LIST_FOREACH makes one more for loop with invalid eina_list pointer.

EINA_LIST_FOREACH_SAFE can prevent from this problem.

Change-Id: I3562cc310632a24ba9435b6e36f5a5ba8bf2d429

src/lib/ecore_file/ecore_file_monitor_inotify.c

index f86b58d..b5e3a45 100644 (file)
@@ -156,7 +156,7 @@ ecore_file_monitor_backend_del(Ecore_File_Monitor *em)
 static Eina_Bool
 _ecore_file_monitor_inotify_handler(void *data EINA_UNUSED, Ecore_Fd_Handler *fdh)
 {
-   Eina_List *l, *ll;
+   Eina_List *l, *ll, *ll2;
    Ecore_File_Monitor *em;
    char buffer[16384];
    struct inotify_event *event;
@@ -176,7 +176,7 @@ _ecore_file_monitor_inotify_handler(void *data EINA_UNUSED, Ecore_Fd_Handler *fd
         i += event_size;
 
         l = _ecore_file_monitor_inotify_monitor_find(event->wd);
-        EINA_LIST_FOREACH(l, ll, em)
+        EINA_LIST_FOREACH_SAFE(l, ll, ll2, em)
           _ecore_file_monitor_inotify_events(em, (event->len ? event->name : NULL), event->mask);
      }