[tracker] Fixes GB#615313 - Avoid Invalid Read when iterating INotifyHandle list



commit e5a951737f521d8ac5ab399e14d77b2f49a04b9f
Author: Aleksander Morgado <aleksander lanedo com>
Date:   Mon Apr 12 17:24:41 2010 +0100

    Fixes GB#615313 - Avoid Invalid Read when iterating INotifyHandle list

 src/libinotify/inotify-monitor.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)
---
diff --git a/src/libinotify/inotify-monitor.c b/src/libinotify/inotify-monitor.c
index ce9317f..b120352 100644
--- a/src/libinotify/inotify-monitor.c
+++ b/src/libinotify/inotify-monitor.c
@@ -46,11 +46,17 @@ process_one_event( struct inotify_event *ine )
 
   inotify_debug( "Got one event" );
 
-  for( list = inotify_listhash_get( ine->wd ); list; list = list->next )
+  list = inotify_listhash_get( ine->wd );
+  while (list)
   {
+    GSList *next = list->next;
     inotify_debug( "  dispatch to %p", list->data );
     inotify_handle_invoke_callback( list->data, filename,
 				    ine->mask, ine->cookie );
+    /* Note that AFTER executing the callback, both the list element and the
+     *  INotifyHandle may already be disposed. So, the pointer to the next
+     *  list element should have been stored before calling the callback */
+    list = next;
   }
 
   if( ine->mask & IN_IGNORED )



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]