mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-29 10:01:25 +00:00
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
9 changed files with 10 additions and 9 deletions
|
@ -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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
/* 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 {
|
||||||
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,
|
||||||
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,
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue