mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
![Richard Guy Briggs](/assets/img/avatar_default.png)
This patch adds a flag, FAN_INFO and an extensible buffer to provide additional information about response decisions. The buffer contains one or more headers defining the information type and the length of the following information. The patch defines one additional information type, FAN_RESPONSE_INFO_AUDIT_RULE, to audit a rule number. This will allow for the creation of other information types in the future if other users of the API identify different needs. The kernel can be tested if it supports a given info type by supplying the complete info extension but setting fd to FAN_NOFD. It will return the expected size but not issue an audit record. Suggested-by: Steve Grubb <sgrubb@redhat.com> Link: https://lore.kernel.org/r/2745105.e9J7NaK4W3@x2 Suggested-by: Jan Kara <jack@suse.cz> Link: https://lore.kernel.org/r/20201001101219.GE17860@quack2.suse.cz Tested-by: Steve Grubb <sgrubb@redhat.com> Acked-by: Steve Grubb <sgrubb@redhat.com> Signed-off-by: Richard Guy Briggs <rgb@redhat.com> Signed-off-by: Jan Kara <jack@suse.cz> Message-Id: <10177cfcae5480926b7176321a28d9da6835b667.1675373475.git.rgb@redhat.com>
245 lines
8.1 KiB
C
245 lines
8.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
#ifndef _UAPI_LINUX_FANOTIFY_H
|
|
#define _UAPI_LINUX_FANOTIFY_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
/* the following events that user-space can register for */
|
|
#define FAN_ACCESS 0x00000001 /* File was accessed */
|
|
#define FAN_MODIFY 0x00000002 /* File was modified */
|
|
#define FAN_ATTRIB 0x00000004 /* Metadata changed */
|
|
#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_MOVED_FROM 0x00000040 /* File was moved from X */
|
|
#define FAN_MOVED_TO 0x00000080 /* File was moved to Y */
|
|
#define FAN_CREATE 0x00000100 /* Subfile was created */
|
|
#define FAN_DELETE 0x00000200 /* Subfile was deleted */
|
|
#define FAN_DELETE_SELF 0x00000400 /* Self was deleted */
|
|
#define FAN_MOVE_SELF 0x00000800 /* Self was moved */
|
|
#define FAN_OPEN_EXEC 0x00001000 /* File was opened for exec */
|
|
|
|
#define FAN_Q_OVERFLOW 0x00004000 /* Event queued overflowed */
|
|
#define FAN_FS_ERROR 0x00008000 /* Filesystem error */
|
|
|
|
#define FAN_OPEN_PERM 0x00010000 /* File open in perm check */
|
|
#define FAN_ACCESS_PERM 0x00020000 /* File accessed in perm check */
|
|
#define FAN_OPEN_EXEC_PERM 0x00040000 /* File open/exec in perm check */
|
|
|
|
#define FAN_EVENT_ON_CHILD 0x08000000 /* Interested in child events */
|
|
|
|
#define FAN_RENAME 0x10000000 /* File was renamed */
|
|
|
|
#define FAN_ONDIR 0x40000000 /* Event occurred against dir */
|
|
|
|
/* helper events */
|
|
#define FAN_CLOSE (FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE) /* close */
|
|
#define FAN_MOVE (FAN_MOVED_FROM | FAN_MOVED_TO) /* moves */
|
|
|
|
/* flags used for fanotify_init() */
|
|
#define FAN_CLOEXEC 0x00000001
|
|
#define FAN_NONBLOCK 0x00000002
|
|
|
|
/* These are NOT bitwise flags. Both bits are used together. */
|
|
#define FAN_CLASS_NOTIF 0x00000000
|
|
#define FAN_CLASS_CONTENT 0x00000004
|
|
#define FAN_CLASS_PRE_CONTENT 0x00000008
|
|
|
|
/* Deprecated - do not use this in programs and do not add new flags here! */
|
|
#define FAN_ALL_CLASS_BITS (FAN_CLASS_NOTIF | FAN_CLASS_CONTENT | \
|
|
FAN_CLASS_PRE_CONTENT)
|
|
|
|
#define FAN_UNLIMITED_QUEUE 0x00000010
|
|
#define FAN_UNLIMITED_MARKS 0x00000020
|
|
#define FAN_ENABLE_AUDIT 0x00000040
|
|
|
|
/* Flags to determine fanotify event format */
|
|
#define FAN_REPORT_PIDFD 0x00000080 /* Report pidfd for event->pid */
|
|
#define FAN_REPORT_TID 0x00000100 /* event->pid is thread id */
|
|
#define FAN_REPORT_FID 0x00000200 /* Report unique file id */
|
|
#define FAN_REPORT_DIR_FID 0x00000400 /* Report unique directory id */
|
|
#define FAN_REPORT_NAME 0x00000800 /* Report events with name */
|
|
#define FAN_REPORT_TARGET_FID 0x00001000 /* Report dirent target id */
|
|
|
|
/* Convenience macro - FAN_REPORT_NAME requires FAN_REPORT_DIR_FID */
|
|
#define FAN_REPORT_DFID_NAME (FAN_REPORT_DIR_FID | FAN_REPORT_NAME)
|
|
/* Convenience macro - FAN_REPORT_TARGET_FID requires all other FID flags */
|
|
#define FAN_REPORT_DFID_NAME_TARGET (FAN_REPORT_DFID_NAME | \
|
|
FAN_REPORT_FID | FAN_REPORT_TARGET_FID)
|
|
|
|
/* Deprecated - do not use this in programs and do not add new flags here! */
|
|
#define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK | \
|
|
FAN_ALL_CLASS_BITS | FAN_UNLIMITED_QUEUE |\
|
|
FAN_UNLIMITED_MARKS)
|
|
|
|
/* flags used for fanotify_modify_mark() */
|
|
#define FAN_MARK_ADD 0x00000001
|
|
#define FAN_MARK_REMOVE 0x00000002
|
|
#define FAN_MARK_DONT_FOLLOW 0x00000004
|
|
#define FAN_MARK_ONLYDIR 0x00000008
|
|
/* FAN_MARK_MOUNT is 0x00000010 */
|
|
#define FAN_MARK_IGNORED_MASK 0x00000020
|
|
#define FAN_MARK_IGNORED_SURV_MODIFY 0x00000040
|
|
#define FAN_MARK_FLUSH 0x00000080
|
|
/* FAN_MARK_FILESYSTEM is 0x00000100 */
|
|
#define FAN_MARK_EVICTABLE 0x00000200
|
|
/* This bit is mutually exclusive with FAN_MARK_IGNORED_MASK bit */
|
|
#define FAN_MARK_IGNORE 0x00000400
|
|
|
|
/* These are NOT bitwise flags. Both bits can be used togther. */
|
|
#define FAN_MARK_INODE 0x00000000
|
|
#define FAN_MARK_MOUNT 0x00000010
|
|
#define FAN_MARK_FILESYSTEM 0x00000100
|
|
|
|
/*
|
|
* Convenience macro - FAN_MARK_IGNORE requires FAN_MARK_IGNORED_SURV_MODIFY
|
|
* for non-inode mark types.
|
|
*/
|
|
#define FAN_MARK_IGNORE_SURV (FAN_MARK_IGNORE | FAN_MARK_IGNORED_SURV_MODIFY)
|
|
|
|
/* Deprecated - do not use this in programs and do not add new flags here! */
|
|
#define FAN_ALL_MARK_FLAGS (FAN_MARK_ADD |\
|
|
FAN_MARK_REMOVE |\
|
|
FAN_MARK_DONT_FOLLOW |\
|
|
FAN_MARK_ONLYDIR |\
|
|
FAN_MARK_MOUNT |\
|
|
FAN_MARK_IGNORED_MASK |\
|
|
FAN_MARK_IGNORED_SURV_MODIFY |\
|
|
FAN_MARK_FLUSH)
|
|
|
|
/* Deprecated - do not use this in programs and do not add new flags here! */
|
|
#define FAN_ALL_EVENTS (FAN_ACCESS |\
|
|
FAN_MODIFY |\
|
|
FAN_CLOSE |\
|
|
FAN_OPEN)
|
|
|
|
/*
|
|
* All events which require a permission response from userspace
|
|
*/
|
|
/* Deprecated - do not use this in programs and do not add new flags here! */
|
|
#define FAN_ALL_PERM_EVENTS (FAN_OPEN_PERM |\
|
|
FAN_ACCESS_PERM)
|
|
|
|
/* Deprecated - do not use this in programs and do not add new flags here! */
|
|
#define FAN_ALL_OUTGOING_EVENTS (FAN_ALL_EVENTS |\
|
|
FAN_ALL_PERM_EVENTS |\
|
|
FAN_Q_OVERFLOW)
|
|
|
|
#define FANOTIFY_METADATA_VERSION 3
|
|
|
|
struct fanotify_event_metadata {
|
|
__u32 event_len;
|
|
__u8 vers;
|
|
__u8 reserved;
|
|
__u16 metadata_len;
|
|
__aligned_u64 mask;
|
|
__s32 fd;
|
|
__s32 pid;
|
|
};
|
|
|
|
#define FAN_EVENT_INFO_TYPE_FID 1
|
|
#define FAN_EVENT_INFO_TYPE_DFID_NAME 2
|
|
#define FAN_EVENT_INFO_TYPE_DFID 3
|
|
#define FAN_EVENT_INFO_TYPE_PIDFD 4
|
|
#define FAN_EVENT_INFO_TYPE_ERROR 5
|
|
|
|
/* Special info types for FAN_RENAME */
|
|
#define FAN_EVENT_INFO_TYPE_OLD_DFID_NAME 10
|
|
/* Reserved for FAN_EVENT_INFO_TYPE_OLD_DFID 11 */
|
|
#define FAN_EVENT_INFO_TYPE_NEW_DFID_NAME 12
|
|
/* Reserved for FAN_EVENT_INFO_TYPE_NEW_DFID 13 */
|
|
|
|
/* Variable length info record following event metadata */
|
|
struct fanotify_event_info_header {
|
|
__u8 info_type;
|
|
__u8 pad;
|
|
__u16 len;
|
|
};
|
|
|
|
/*
|
|
* Unique file identifier info record.
|
|
* This structure is used for records of types FAN_EVENT_INFO_TYPE_FID,
|
|
* FAN_EVENT_INFO_TYPE_DFID and FAN_EVENT_INFO_TYPE_DFID_NAME.
|
|
* For FAN_EVENT_INFO_TYPE_DFID_NAME there is additionally a null terminated
|
|
* name immediately after the file handle.
|
|
*/
|
|
struct fanotify_event_info_fid {
|
|
struct fanotify_event_info_header hdr;
|
|
__kernel_fsid_t fsid;
|
|
/*
|
|
* Following is an opaque struct file_handle that can be passed as
|
|
* an argument to open_by_handle_at(2).
|
|
*/
|
|
unsigned char handle[];
|
|
};
|
|
|
|
/*
|
|
* This structure is used for info records of type FAN_EVENT_INFO_TYPE_PIDFD.
|
|
* It holds a pidfd for the pid that was responsible for generating an event.
|
|
*/
|
|
struct fanotify_event_info_pidfd {
|
|
struct fanotify_event_info_header hdr;
|
|
__s32 pidfd;
|
|
};
|
|
|
|
struct fanotify_event_info_error {
|
|
struct fanotify_event_info_header hdr;
|
|
__s32 error;
|
|
__u32 error_count;
|
|
};
|
|
|
|
/*
|
|
* User space may need to record additional information about its decision.
|
|
* The extra information type records what kind of information is included.
|
|
* The default is none. We also define an extra information buffer whose
|
|
* size is determined by the extra information type.
|
|
*
|
|
* If the information type is Audit Rule, then the information following
|
|
* is the rule number that triggered the user space decision that
|
|
* requires auditing.
|
|
*/
|
|
|
|
#define FAN_RESPONSE_INFO_NONE 0
|
|
#define FAN_RESPONSE_INFO_AUDIT_RULE 1
|
|
|
|
struct fanotify_response {
|
|
__s32 fd;
|
|
__u32 response;
|
|
};
|
|
|
|
struct fanotify_response_info_header {
|
|
__u8 type;
|
|
__u8 pad;
|
|
__u16 len;
|
|
};
|
|
|
|
struct fanotify_response_info_audit_rule {
|
|
struct fanotify_response_info_header hdr;
|
|
__u32 rule_number;
|
|
__u32 subj_trust;
|
|
__u32 obj_trust;
|
|
};
|
|
|
|
/* Legit userspace responses to a _PERM event */
|
|
#define FAN_ALLOW 0x01
|
|
#define FAN_DENY 0x02
|
|
#define FAN_AUDIT 0x10 /* Bitmask to create audit record for result */
|
|
#define FAN_INFO 0x20 /* Bitmask to indicate additional information */
|
|
|
|
/* No fd set in event */
|
|
#define FAN_NOFD -1
|
|
#define FAN_NOPIDFD FAN_NOFD
|
|
#define FAN_EPIDFD -2
|
|
|
|
/* Helper functions to deal with fanotify_event_metadata buffers */
|
|
#define FAN_EVENT_METADATA_LEN (sizeof(struct fanotify_event_metadata))
|
|
|
|
#define FAN_EVENT_NEXT(meta, len) ((len) -= (meta)->event_len, \
|
|
(struct fanotify_event_metadata*)(((char *)(meta)) + \
|
|
(meta)->event_len))
|
|
|
|
#define FAN_EVENT_OK(meta, len) ((long)(len) >= (long)FAN_EVENT_METADATA_LEN && \
|
|
(long)(meta)->event_len >= (long)FAN_EVENT_METADATA_LEN && \
|
|
(long)(meta)->event_len <= (long)(len))
|
|
|
|
#endif /* _UAPI_LINUX_FANOTIFY_H */
|