Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b076f1c authored by Matthew Bobrowski's avatar Matthew Bobrowski Committed by Jan Kara
Browse files

fanotify: introduce new event mask FAN_OPEN_EXEC



A new event mask 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. Events of FAN_OPEN_EXEC type will be
generated when a file has been opened using either execve(), execveat()
or uselib() system calls.

The feature is implemented within fsnotify_open() by generating the
FAN_OPEN_EXEC event type if __FMODE_EXEC is set within file->f_flags.

Signed-off-by: default avatarMatthew Bobrowski <mbobrowski@mbobrowski.org>
Reviewed-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 2d10b230
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -210,8 +210,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);

	mask = fanotify_group_event_mask(iter_info, mask, data, data_type);
	if (!mask)
+1 −1
Original line number Diff line number Diff line
@@ -401,7 +401,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)
+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,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)
+2 −0
Original line number Diff line number Diff line
@@ -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);
+5 −2
Original line number Diff line number Diff line
@@ -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 | \
Loading