Commit 45a22f4c authored by Jan Kara's avatar Jan Kara

inotify: Fix reporting of cookies for inotify events

My rework of handling of notification events (namely commit 7053aee2
"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: 7053aee2Reported-by: default avatarVegard Nossum <vegard.nossum@oracle.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 6d0abeca
...@@ -86,7 +86,7 @@ static int dnotify_handle_event(struct fsnotify_group *group, ...@@ -86,7 +86,7 @@ static int dnotify_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *inode_mark, struct fsnotify_mark *inode_mark,
struct fsnotify_mark *vfsmount_mark, struct fsnotify_mark *vfsmount_mark,
u32 mask, void *data, int data_type, 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_mark *dn_mark;
struct dnotify_struct *dn; struct dnotify_struct *dn;
......
...@@ -147,7 +147,7 @@ static int fanotify_handle_event(struct fsnotify_group *group, ...@@ -147,7 +147,7 @@ static int fanotify_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *inode_mark, struct fsnotify_mark *inode_mark,
struct fsnotify_mark *fanotify_mark, struct fsnotify_mark *fanotify_mark,
u32 mask, void *data, int data_type, u32 mask, void *data, int data_type,
const unsigned char *file_name) const unsigned char *file_name, u32 cookie)
{ {
int ret = 0; int ret = 0;
struct fanotify_event_info *event; struct fanotify_event_info *event;
......
...@@ -179,7 +179,7 @@ static int send_to_group(struct inode *to_tell, ...@@ -179,7 +179,7 @@ static int send_to_group(struct inode *to_tell,
return group->ops->handle_event(group, to_tell, inode_mark, return group->ops->handle_event(group, to_tell, inode_mark,
vfsmount_mark, mask, data, data_is, vfsmount_mark, mask, data, data_is,
file_name); file_name, cookie);
} }
/* /*
......
...@@ -27,6 +27,6 @@ extern int inotify_handle_event(struct fsnotify_group *group, ...@@ -27,6 +27,6 @@ extern int inotify_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *inode_mark, struct fsnotify_mark *inode_mark,
struct fsnotify_mark *vfsmount_mark, struct fsnotify_mark *vfsmount_mark,
u32 mask, void *data, int data_type, 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; extern const struct fsnotify_ops inotify_fsnotify_ops;
...@@ -67,7 +67,7 @@ int inotify_handle_event(struct fsnotify_group *group, ...@@ -67,7 +67,7 @@ int inotify_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *inode_mark, struct fsnotify_mark *inode_mark,
struct fsnotify_mark *vfsmount_mark, struct fsnotify_mark *vfsmount_mark,
u32 mask, void *data, int data_type, 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_inode_mark *i_mark;
struct inotify_event_info *event; struct inotify_event_info *event;
...@@ -103,6 +103,7 @@ int inotify_handle_event(struct fsnotify_group *group, ...@@ -103,6 +103,7 @@ int inotify_handle_event(struct fsnotify_group *group,
fsn_event = &event->fse; fsn_event = &event->fse;
fsnotify_init_event(fsn_event, inode, mask); fsnotify_init_event(fsn_event, inode, mask);
event->wd = i_mark->wd; event->wd = i_mark->wd;
event->sync_cookie = cookie;
event->name_len = len; event->name_len = len;
if (len) if (len)
strcpy(event->name, file_name); strcpy(event->name, file_name);
......
...@@ -495,7 +495,7 @@ void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark, ...@@ -495,7 +495,7 @@ void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark,
/* Queue ignore event for the watch */ /* Queue ignore event for the watch */
inotify_handle_event(group, NULL, fsn_mark, NULL, FS_IN_IGNORED, 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); i_mark = container_of(fsn_mark, struct inotify_inode_mark, fsn_mark);
/* remove this mark from the idr */ /* remove this mark from the idr */
......
...@@ -99,7 +99,7 @@ struct fsnotify_ops { ...@@ -99,7 +99,7 @@ struct fsnotify_ops {
struct fsnotify_mark *inode_mark, struct fsnotify_mark *inode_mark,
struct fsnotify_mark *vfsmount_mark, struct fsnotify_mark *vfsmount_mark,
u32 mask, void *data, int data_type, 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 (*free_group_priv)(struct fsnotify_group *group);
void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group); void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group);
void (*free_event)(struct fsnotify_event *event); void (*free_event)(struct fsnotify_event *event);
......
...@@ -916,7 +916,7 @@ static int audit_tree_handle_event(struct fsnotify_group *group, ...@@ -916,7 +916,7 @@ static int audit_tree_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *inode_mark, struct fsnotify_mark *inode_mark,
struct fsnotify_mark *vfsmount_mark, struct fsnotify_mark *vfsmount_mark,
u32 mask, void *data, int data_type, u32 mask, void *data, int data_type,
const unsigned char *file_name) const unsigned char *file_name, u32 cookie)
{ {
return 0; return 0;
} }
......
...@@ -471,7 +471,7 @@ static int audit_watch_handle_event(struct fsnotify_group *group, ...@@ -471,7 +471,7 @@ static int audit_watch_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *inode_mark, struct fsnotify_mark *inode_mark,
struct fsnotify_mark *vfsmount_mark, struct fsnotify_mark *vfsmount_mark,
u32 mask, void *data, int data_type, u32 mask, void *data, int data_type,
const unsigned char *dname) const unsigned char *dname, u32 cookie)
{ {
struct inode *inode; struct inode *inode;
struct audit_parent *parent; struct audit_parent *parent;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment