Alexandre Julliard : server: Fixed handling of inotify record length.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 8 09:12:42 CST 2006


Module: wine
Branch: refs/heads/master
Commit: e979832dda71deeea092c31046f543fbeec13c5c
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=e979832dda71deeea092c31046f543fbeec13c5c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Feb  8 15:06:42 2006 +0100

server: Fixed handling of inotify record length.

---

 server/change.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/server/change.c b/server/change.c
index c35a82c..e32997e 100644
--- a/server/change.c
+++ b/server/change.c
@@ -416,7 +416,8 @@ static void inotify_do_change_notify( st
 
     if (dir->want_data)
     {
-        record = malloc( sizeof (*record) + ie->len - 1 ) ;
+        size_t len = strlen(ie->name);
+        record = malloc( offsetof(struct change_record, name[len]) );
         if (!record)
             return;
 
@@ -426,8 +427,8 @@ static void inotify_do_change_notify( st
             record->action = FILE_ACTION_REMOVED;
         else
             record->action = FILE_ACTION_MODIFIED;
-        memcpy( record->name, ie->name, ie->len );
-        record->len = strlen( ie->name );
+        memcpy( record->name, ie->name, len );
+        record->len = len;
 
         list_add_tail( &dir->change_records, &record->entry );
     }
@@ -456,13 +457,14 @@ static void inotify_poll_event( struct f
         return;
     }
 
-    for( ofs = 0; ofs < r; )
+    for( ofs = 0; ofs < r - offsetof(struct inotify_event, name); )
     {
         ie = (struct inotify_event*) &buffer[ofs];
         if (!ie->len)
             break;
+        ofs += offsetof( struct inotify_event, name[ie->len] );
+        if (ofs > r) break;
         inotify_do_change_notify( dir, ie );
-        ofs += (sizeof (*ie) + ie->len - 1);
     }
 }
 




More information about the wine-cvs mailing list