inotify: Fix reporting of cookies for inotify events
My rework of handling of notification events (namely commit7053aee26a
"fsnotify: do not share events between notification groups") broke sending of cookies with inotify events. We didn't propagate the value passed to fsnotify() properly and passed 4 uninitialized bytes to userspace instead (so it is also an information leak). Sadly I didn't notice this during my testing because inotify cookies aren't used very much and LTP inotify tests ignore them. Fix the problem by passing the cookie value properly. Fixes:7053aee26a
Reported-by: Vegard Nossum <vegard.nossum@oracle.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
6d0abeca32
commit
45a22f4c11
|
@ -86,7 +86,7 @@ static int dnotify_handle_event(struct fsnotify_group *group,
|
|||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *file_name)
|
||||
const unsigned char *file_name, u32 cookie)
|
||||
{
|
||||
struct dnotify_mark *dn_mark;
|
||||
struct dnotify_struct *dn;
|
||||
|
|
|
@ -147,7 +147,7 @@ static int fanotify_handle_event(struct fsnotify_group *group,
|
|||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *fanotify_mark,
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *file_name)
|
||||
const unsigned char *file_name, u32 cookie)
|
||||
{
|
||||
int ret = 0;
|
||||
struct fanotify_event_info *event;
|
||||
|
|
|
@ -179,7 +179,7 @@ static int send_to_group(struct inode *to_tell,
|
|||
|
||||
return group->ops->handle_event(group, to_tell, inode_mark,
|
||||
vfsmount_mark, mask, data, data_is,
|
||||
file_name);
|
||||
file_name, cookie);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -27,6 +27,6 @@ extern int inotify_handle_event(struct fsnotify_group *group,
|
|||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *file_name);
|
||||
const unsigned char *file_name, u32 cookie);
|
||||
|
||||
extern const struct fsnotify_ops inotify_fsnotify_ops;
|
||||
|
|
|
@ -67,7 +67,7 @@ int inotify_handle_event(struct fsnotify_group *group,
|
|||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *file_name)
|
||||
const unsigned char *file_name, u32 cookie)
|
||||
{
|
||||
struct inotify_inode_mark *i_mark;
|
||||
struct inotify_event_info *event;
|
||||
|
@ -103,6 +103,7 @@ int inotify_handle_event(struct fsnotify_group *group,
|
|||
fsn_event = &event->fse;
|
||||
fsnotify_init_event(fsn_event, inode, mask);
|
||||
event->wd = i_mark->wd;
|
||||
event->sync_cookie = cookie;
|
||||
event->name_len = len;
|
||||
if (len)
|
||||
strcpy(event->name, file_name);
|
||||
|
|
|
@ -495,7 +495,7 @@ void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark,
|
|||
|
||||
/* Queue ignore event for the watch */
|
||||
inotify_handle_event(group, NULL, fsn_mark, NULL, FS_IN_IGNORED,
|
||||
NULL, FSNOTIFY_EVENT_NONE, NULL);
|
||||
NULL, FSNOTIFY_EVENT_NONE, NULL, 0);
|
||||
|
||||
i_mark = container_of(fsn_mark, struct inotify_inode_mark, fsn_mark);
|
||||
/* remove this mark from the idr */
|
||||
|
|
|
@ -99,7 +99,7 @@ struct fsnotify_ops {
|
|||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *file_name);
|
||||
const unsigned char *file_name, u32 cookie);
|
||||
void (*free_group_priv)(struct fsnotify_group *group);
|
||||
void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group);
|
||||
void (*free_event)(struct fsnotify_event *event);
|
||||
|
|
|
@ -916,7 +916,7 @@ static int audit_tree_handle_event(struct fsnotify_group *group,
|
|||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *file_name)
|
||||
const unsigned char *file_name, u32 cookie)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -471,7 +471,7 @@ static int audit_watch_handle_event(struct fsnotify_group *group,
|
|||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *dname)
|
||||
const unsigned char *dname, u32 cookie)
|
||||
{
|
||||
struct inode *inode;
|
||||
struct audit_parent *parent;
|
||||
|
|
Loading…
Reference in New Issue