server: Fixed handling of inotify record length.

This commit is contained in:
Alexandre Julliard 2006-02-08 15:06:42 +01:00
parent d815b50756
commit e979832dda
1 changed files with 7 additions and 5 deletions

View File

@ -416,7 +416,8 @@ static void inotify_do_change_notify( struct dir *dir, struct inotify_event *ie
if (dir->want_data) 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) if (!record)
return; return;
@ -426,8 +427,8 @@ static void inotify_do_change_notify( struct dir *dir, struct inotify_event *ie
record->action = FILE_ACTION_REMOVED; record->action = FILE_ACTION_REMOVED;
else else
record->action = FILE_ACTION_MODIFIED; record->action = FILE_ACTION_MODIFIED;
memcpy( record->name, ie->name, ie->len ); memcpy( record->name, ie->name, len );
record->len = strlen( ie->name ); record->len = len;
list_add_tail( &dir->change_records, &record->entry ); list_add_tail( &dir->change_records, &record->entry );
} }
@ -456,13 +457,14 @@ static void inotify_poll_event( struct fd *fd, int event )
return; return;
} }
for( ofs = 0; ofs < r; ) for( ofs = 0; ofs < r - offsetof(struct inotify_event, name); )
{ {
ie = (struct inotify_event*) &buffer[ofs]; ie = (struct inotify_event*) &buffer[ofs];
if (!ie->len) if (!ie->len)
break; break;
ofs += offsetof( struct inotify_event, name[ie->len] );
if (ofs > r) break;
inotify_do_change_notify( dir, ie ); inotify_do_change_notify( dir, ie );
ofs += (sizeof (*ie) + ie->len - 1);
} }
} }