On Thu 11-10-18 21:42:23, Matthew Bobrowski wrote: > A new event type FAN_OPEN_EXEC has been defined so that users have the > ability to receive events specifically when a file has been opened with > the intent to be executed. Can we perhaps expand this a bit to clarify that this means execve(), execve_at(), and uselib() syscalls? Then the sentence below could just clarify that feature is implemented by fanotify_open() generating FAN_OPEN_EXEC event if __FMODE_EXEC is set within file->f_flags. Thanks! Honza > The FAN_OPEN_EXEC flag is set within the fsnotify_open() hook only if a > file has the __FMODE_EXEC bit set within file->f_flags. > > Signed-off-by: Matthew Bobrowski <mbobrowski@xxxxxxxxxxxxxx> > --- > fs/notify/fanotify/fanotify.c | 3 ++- > fs/notify/fsnotify.c | 2 +- > include/linux/fanotify.h | 2 +- > include/linux/fsnotify.h | 2 ++ > include/linux/fsnotify_backend.h | 7 +++++-- > include/uapi/linux/fanotify.h | 1 + > 6 files changed, 12 insertions(+), 5 deletions(-) > > diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c > index 2c57186caa2e..b3e92302ed84 100644 > --- a/fs/notify/fanotify/fanotify.c > +++ b/fs/notify/fanotify/fanotify.c > @@ -207,8 +207,9 @@ static int fanotify_handle_event(struct fsnotify_group *group, > BUILD_BUG_ON(FAN_OPEN_PERM != FS_OPEN_PERM); > BUILD_BUG_ON(FAN_ACCESS_PERM != FS_ACCESS_PERM); > BUILD_BUG_ON(FAN_ONDIR != FS_ISDIR); > + BUILD_BUG_ON(FAN_OPEN_EXEC != FS_OPEN_EXEC); > > - BUILD_BUG_ON(HWEIGHT32(ALL_FANOTIFY_EVENT_BITS) != 10); > + BUILD_BUG_ON(HWEIGHT32(ALL_FANOTIFY_EVENT_BITS) != 11); > > if (!fanotify_should_send_event(iter_info, mask, data, data_type)) > return 0; > diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c > index a0ad06285450..051e5fc0dba1 100644 > --- a/fs/notify/fsnotify.c > +++ b/fs/notify/fsnotify.c > @@ -402,7 +402,7 @@ static __init int fsnotify_init(void) > { > int ret; > > - BUILD_BUG_ON(HWEIGHT32(ALL_FSNOTIFY_BITS) != 23); > + BUILD_BUG_ON(HWEIGHT32(ALL_FSNOTIFY_BITS) != 24); > > ret = init_srcu_struct(&fsnotify_mark_srcu); > if (ret) > diff --git a/include/linux/fanotify.h b/include/linux/fanotify.h > index 05b696b4856b..0e07d23b6c17 100644 > --- a/include/linux/fanotify.h > +++ b/include/linux/fanotify.h > @@ -39,7 +39,7 @@ > > /* Events that user can request to be notified on */ > #define FANOTIFY_EVENTS (FAN_ACCESS | FAN_MODIFY | \ > - FAN_CLOSE | FAN_OPEN) > + FAN_CLOSE | FAN_OPEN | FAN_OPEN_EXEC) > > /* Events that require a permission response from user */ > #define FANOTIFY_PERM_EVENTS (FAN_OPEN_PERM | FAN_ACCESS_PERM) > diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h > index fd1ce10553bf..1fe5ac93b252 100644 > --- a/include/linux/fsnotify.h > +++ b/include/linux/fsnotify.h > @@ -215,6 +215,8 @@ static inline void fsnotify_open(struct file *file) > > if (S_ISDIR(inode->i_mode)) > mask |= FS_ISDIR; > + if (file->f_flags & __FMODE_EXEC) > + mask |= FS_OPEN_EXEC; > > fsnotify_parent(path, NULL, mask); > fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); > diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h > index 135b973e44d1..329ac6684326 100644 > --- a/include/linux/fsnotify_backend.h > +++ b/include/linux/fsnotify_backend.h > @@ -38,6 +38,7 @@ > #define FS_DELETE 0x00000200 /* Subfile was deleted */ > #define FS_DELETE_SELF 0x00000400 /* Self was deleted */ > #define FS_MOVE_SELF 0x00000800 /* Self was moved */ > +#define FS_OPEN_EXEC 0x00001000 /* File was opened for exec */ > > #define FS_UNMOUNT 0x00002000 /* inode on umount fs */ > #define FS_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ > @@ -62,7 +63,8 @@ > #define FS_EVENTS_POSS_ON_CHILD (FS_ACCESS | FS_MODIFY | FS_ATTRIB |\ > FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN |\ > FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE |\ > - FS_DELETE | FS_OPEN_PERM | FS_ACCESS_PERM) > + FS_DELETE | FS_OPEN_PERM | FS_ACCESS_PERM |\ > + FS_OPEN_EXEC) > > #define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO) > > @@ -74,7 +76,8 @@ > FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE | \ > FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \ > FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \ > - FS_OPEN_PERM | FS_ACCESS_PERM | FS_DN_RENAME) > + FS_OPEN_PERM | FS_ACCESS_PERM | FS_DN_RENAME |\ > + FS_OPEN_EXEC) > > /* Extra flags that may be reported with event or control handling of events */ > #define ALL_FSNOTIFY_FLAGS (FS_EXCL_UNLINK | FS_ISDIR | FS_IN_ONESHOT | \ > diff --git a/include/uapi/linux/fanotify.h b/include/uapi/linux/fanotify.h > index 00b2304ed124..da278f11ab29 100644 > --- a/include/uapi/linux/fanotify.h > +++ b/include/uapi/linux/fanotify.h > @@ -10,6 +10,7 @@ > #define FAN_CLOSE_WRITE 0x00000008 /* Writtable file closed */ > #define FAN_CLOSE_NOWRITE 0x00000010 /* Unwrittable file closed */ > #define FAN_OPEN 0x00000020 /* File was opened */ > +#define FAN_OPEN_EXEC 0x00001000 /* File was opened for exec */ > > #define FAN_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ > > -- > 2.17.2 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR