* [LTP] [PATCH v3 0/3] Add test support for the new fanotify FAN_REPORT_PIDFD feature
@ 2021-11-09 10:04 Matthew Bobrowski via ltp
2021-11-09 10:04 ` [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) Matthew Bobrowski via ltp
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Matthew Bobrowski via ltp @ 2021-11-09 10:04 UTC (permalink / raw)
To: ltp; +Cc: jack
This is a follow up series of the previous series [0] that I had
posted through which factors in Amir's recommendation around the
splitting of the new macro helper into a separate patch.
Apart from that, there's no difference.
[0] https://lore.kernel.org/ltp/cover.1635849607.git.repnop@google.com/
Matthew Bobrowski (3):
syscalls/fanotify: Add a helper macro which checks for the presence of
specific fanotify initialization flag(s)
syscalls/fanotify20: add new test for FAN_REPORT_PIDFD
syscalls/fanotify21: test returned pidfd from fanotify in
FAN_REPORT_PIDFD mode
testcases/kernel/syscalls/fanotify/.gitignore | 2 +
testcases/kernel/syscalls/fanotify/fanotify.h | 26 ++
.../kernel/syscalls/fanotify/fanotify20.c | 128 ++++++++
.../kernel/syscalls/fanotify/fanotify21.c | 306 ++++++++++++++++++
4 files changed, 462 insertions(+)
create mode 100644 testcases/kernel/syscalls/fanotify/fanotify20.c
create mode 100644 testcases/kernel/syscalls/fanotify/fanotify21.c
--
2.34.0.rc0.344.g81b53c2807-goog
/M
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 8+ messages in thread* [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) 2021-11-09 10:04 [LTP] [PATCH v3 0/3] Add test support for the new fanotify FAN_REPORT_PIDFD feature Matthew Bobrowski via ltp @ 2021-11-09 10:04 ` Matthew Bobrowski via ltp 2021-11-09 11:05 ` Amir Goldstein 2021-11-09 10:05 ` [LTP] [PATCH v3 2/3] syscalls/fanotify20: add new test for FAN_REPORT_PIDFD Matthew Bobrowski via ltp 2021-11-09 10:05 ` [LTP] [PATCH v3 3/3] syscalls/fanotify21: test returned pidfd from fanotify in FAN_REPORT_PIDFD mode Matthew Bobrowski via ltp 2 siblings, 1 reply; 8+ messages in thread From: Matthew Bobrowski via ltp @ 2021-11-09 10:04 UTC (permalink / raw) To: ltp; +Cc: jack This is a trivial macro that can be used throughout fanotify tests to check whether the underlying running kernel supports the supplied fanotify initialization flag(s). Signed-off-by: Matthew Bobrowski <repnop@google.com> --- testcases/kernel/syscalls/fanotify/fanotify.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/testcases/kernel/syscalls/fanotify/fanotify.h b/testcases/kernel/syscalls/fanotify/fanotify.h index a2be18338..e2db3c6f5 100644 --- a/testcases/kernel/syscalls/fanotify/fanotify.h +++ b/testcases/kernel/syscalls/fanotify/fanotify.h @@ -352,6 +352,11 @@ static inline void fanotify_init_flags_err_msg(const char *flags_str, fanotify_init_flags_supported_on_fs(flags, fname)); \ } while (0) +#define REQUIRE_FANOTIFY_INIT_FLAGS_SUPPORTED_BY_KERNEL(flags) do { \ + fanotify_init_flags_err_msg(#flags, __FILE__, __LINE__, tst_brk_, \ + fanotify_init_flags_supported_by_kernel(flags)); \ + } while (0) + static inline int fanotify_mark_supported_by_kernel(uint64_t flag) { int fd; -- 2.34.0.rc0.344.g81b53c2807-goog /M -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) 2021-11-09 10:04 ` [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) Matthew Bobrowski via ltp @ 2021-11-09 11:05 ` Amir Goldstein 2021-11-15 21:20 ` Petr Vorel 0 siblings, 1 reply; 8+ messages in thread From: Amir Goldstein @ 2021-11-09 11:05 UTC (permalink / raw) To: Matthew Bobrowski; +Cc: Jan Kara, LTP List On Tue, Nov 9, 2021 at 12:05 PM Matthew Bobrowski <repnop@google.com> wrote: > > This is a trivial macro that can be used throughout fanotify tests to > check whether the underlying running kernel supports the supplied > fanotify initialization flag(s). > > Signed-off-by: Matthew Bobrowski <repnop@google.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> > --- > testcases/kernel/syscalls/fanotify/fanotify.h | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/testcases/kernel/syscalls/fanotify/fanotify.h b/testcases/kernel/syscalls/fanotify/fanotify.h > index a2be18338..e2db3c6f5 100644 > --- a/testcases/kernel/syscalls/fanotify/fanotify.h > +++ b/testcases/kernel/syscalls/fanotify/fanotify.h > @@ -352,6 +352,11 @@ static inline void fanotify_init_flags_err_msg(const char *flags_str, > fanotify_init_flags_supported_on_fs(flags, fname)); \ > } while (0) > > +#define REQUIRE_FANOTIFY_INIT_FLAGS_SUPPORTED_BY_KERNEL(flags) do { \ > + fanotify_init_flags_err_msg(#flags, __FILE__, __LINE__, tst_brk_, \ > + fanotify_init_flags_supported_by_kernel(flags)); \ > + } while (0) > + > static inline int fanotify_mark_supported_by_kernel(uint64_t flag) > { > int fd; > -- > 2.34.0.rc0.344.g81b53c2807-goog > > /M -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) 2021-11-09 11:05 ` Amir Goldstein @ 2021-11-15 21:20 ` Petr Vorel 2021-11-16 1:06 ` Matthew Bobrowski via ltp 0 siblings, 1 reply; 8+ messages in thread From: Petr Vorel @ 2021-11-15 21:20 UTC (permalink / raw) To: Matthew Bobrowski, Amir Goldstein; +Cc: Jan Kara, LTP List Hi Matthew, Amir, Tested on two distro kernels with support (Tumbleweed and Debian unstable) + on various old kernels without support. Merged with very minor fixes, see diff below. NOTE: we now support basic static analysis + checkpatch formatting check - run make check in fanotify directory or make check-fanotify20. Thanks a lot! Kind regards, Petr diff --git runtest/syscalls runtest/syscalls index 1e6d46744..d57c73e39 100644 --- runtest/syscalls +++ runtest/syscalls @@ -605,6 +605,8 @@ fanotify16 fanotify16 fanotify17 fanotify17 fanotify18 fanotify18 fanotify19 fanotify19 +fanotify20 fanotify20 +fanotify21 fanotify21 ioperm01 ioperm01 ioperm02 ioperm02 diff --git testcases/kernel/syscalls/fanotify/fanotify20.c testcases/kernel/syscalls/fanotify/fanotify20.c index 9960d85eb..de0fdb782 100644 --- testcases/kernel/syscalls/fanotify/fanotify20.c +++ testcases/kernel/syscalls/fanotify/fanotify20.c @@ -12,6 +12,9 @@ * returns an expected error code when provided an invalid initialization flag * alongside FAN_REPORT_PIDFD. Additionally, it checks that the operability with * existing FAN_REPORT_* flags is maintained and functioning as intended. + * + * NOTE: FAN_REPORT_PIDFD support was added in v5.15-rc1 in af579beb666a + * ("fanotify: add pidfd support to the fanotify API"). */ #define _GNU_SOURCE @@ -39,7 +42,7 @@ static struct test_case_t { }, { "pass on FAN_REPORT_PIDFD | FAN_REPORT_FID | FAN_REPORT_DFID_NAME", - FAN_REPORT_PIDFD | FAN_REPORT_FID | FAN_REPORT_DFID_NAME , + FAN_REPORT_PIDFD | FAN_REPORT_FID | FAN_REPORT_DFID_NAME, 0, 0, }, diff --git testcases/kernel/syscalls/fanotify/fanotify21.c testcases/kernel/syscalls/fanotify/fanotify21.c index e842dad17..6ae70c57e 100644 --- testcases/kernel/syscalls/fanotify/fanotify21.c +++ testcases/kernel/syscalls/fanotify/fanotify21.c @@ -11,6 +11,9 @@ * A test which verifies whether the returned struct * fanotify_event_info_pidfd in FAN_REPORT_PIDFD mode contains the * expected set of information. + * + * NOTE: FAN_REPORT_PIDFD support was added in v5.15-rc1 in af579beb666a + * ("fanotify: add pidfd support to the fanotify API"). */ #define _GNU_SOURCE @@ -56,7 +59,7 @@ struct test_case_t { static int fanotify_fd; static char event_buf[BUF_SZ]; -static struct pidfd_fdinfo_t *self_pidfd_fdinfo = NULL; +static struct pidfd_fdinfo_t *self_pidfd_fdinfo; static struct pidfd_fdinfo_t *read_pidfd_fdinfo(int pidfd) { @@ -158,7 +161,7 @@ static void do_test(unsigned int num) * buffer. */ len = SAFE_READ(0, fanotify_fd, event_buf, sizeof(event_buf)); - while(i < len) { + while (i < len) { struct fanotify_event_metadata *event; struct fanotify_event_info_pidfd *info; struct pidfd_fdinfo_t *event_pidfd_fdinfo = NULL; @@ -197,7 +200,7 @@ static void do_test(unsigned int num) tst_res(TFAIL, "pidfd creation failed for pid: %u with pidfd error value " "set to: %d", - (unsigned)event->pid, + (unsigned int)event->pid, info->pidfd); goto next_event; } else if (tc->want_pidfd_err && @@ -205,14 +208,14 @@ static void do_test(unsigned int num) tst_res(TFAIL, "pidfd set to an unexpected error: %d for pid: %u", info->pidfd, - (unsigned)event->pid); + (unsigned int)event->pid); goto next_event; } else if (tc->want_pidfd_err && info->pidfd == tc->want_pidfd_err) { tst_res(TPASS, "pid: %u terminated before pidfd was created, " "pidfd set to the value of: %d, as expected", - (unsigned)event->pid, + (unsigned int)event->pid, FAN_NOPIDFD); goto next_event; } @@ -227,15 +230,15 @@ static void do_test(unsigned int num) "reading fdinfo for pidfd: %d " "describing pid: %u failed", info->pidfd, - (unsigned)event->pid); + (unsigned int)event->pid); goto next_event; } else if (event_pidfd_fdinfo->pid != event->pid) { tst_res(TFAIL, "pidfd provided for incorrect pid " "(expected pidfd for pid: %u, got pidfd for " "pid: %u)", - (unsigned)event->pid, - (unsigned)event_pidfd_fdinfo->pid); + (unsigned int)event->pid, + (unsigned int)event_pidfd_fdinfo->pid); goto next_event; } else if (memcmp(event_pidfd_fdinfo, self_pidfd_fdinfo, sizeof(struct pidfd_fdinfo_t))) { @@ -261,7 +264,7 @@ static void do_test(unsigned int num) "mask: %lld, pid: %u, fd: %d, " "pidfd: %d, info_type: %d, info_len: %d", (unsigned long long)event->mask, - (unsigned)event->pid, + (unsigned int)event->pid, event->fd, info->pidfd, info->hdr.info_type, -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) 2021-11-15 21:20 ` Petr Vorel @ 2021-11-16 1:06 ` Matthew Bobrowski via ltp 2021-11-16 9:39 ` Petr Vorel 0 siblings, 1 reply; 8+ messages in thread From: Matthew Bobrowski via ltp @ 2021-11-16 1:06 UTC (permalink / raw) To: Petr Vorel; +Cc: Jan Kara, LTP List On Mon, Nov 15, 2021 at 10:20:18PM +0100, Petr Vorel wrote: > Hi Matthew, Amir, > > Tested on two distro kernels with support (Tumbleweed and Debian unstable) > + on various old kernels without support. > > Merged with very minor fixes, see diff below. Noted the changes, they're fine by me. Thanks for the merge! > NOTE: we now support basic static analysis + checkpatch formatting check - run > make check in fanotify directory or make check-fanotify20. Oh, that's great, I had no idea. Quickly running it, looks like there's a bunch of clean up required for some of the older tests. Will have to get around to doing that at some point. > diff --git runtest/syscalls runtest/syscalls > index 1e6d46744..d57c73e39 100644 > --- runtest/syscalls > +++ runtest/syscalls > @@ -605,6 +605,8 @@ fanotify16 fanotify16 > fanotify17 fanotify17 > fanotify18 fanotify18 > fanotify19 fanotify19 > +fanotify20 fanotify20 > +fanotify21 fanotify21 > > ioperm01 ioperm01 > ioperm02 ioperm02 > diff --git testcases/kernel/syscalls/fanotify/fanotify20.c testcases/kernel/syscalls/fanotify/fanotify20.c > index 9960d85eb..de0fdb782 100644 > --- testcases/kernel/syscalls/fanotify/fanotify20.c > +++ testcases/kernel/syscalls/fanotify/fanotify20.c > @@ -12,6 +12,9 @@ > * returns an expected error code when provided an invalid initialization flag > * alongside FAN_REPORT_PIDFD. Additionally, it checks that the operability with > * existing FAN_REPORT_* flags is maintained and functioning as intended. > + * > + * NOTE: FAN_REPORT_PIDFD support was added in v5.15-rc1 in af579beb666a > + * ("fanotify: add pidfd support to the fanotify API"). > */ > > #define _GNU_SOURCE > @@ -39,7 +42,7 @@ static struct test_case_t { > }, > { > "pass on FAN_REPORT_PIDFD | FAN_REPORT_FID | FAN_REPORT_DFID_NAME", > - FAN_REPORT_PIDFD | FAN_REPORT_FID | FAN_REPORT_DFID_NAME , > + FAN_REPORT_PIDFD | FAN_REPORT_FID | FAN_REPORT_DFID_NAME, > 0, > 0, > }, > diff --git testcases/kernel/syscalls/fanotify/fanotify21.c testcases/kernel/syscalls/fanotify/fanotify21.c > index e842dad17..6ae70c57e 100644 > --- testcases/kernel/syscalls/fanotify/fanotify21.c > +++ testcases/kernel/syscalls/fanotify/fanotify21.c > @@ -11,6 +11,9 @@ > * A test which verifies whether the returned struct > * fanotify_event_info_pidfd in FAN_REPORT_PIDFD mode contains the > * expected set of information. > + * > + * NOTE: FAN_REPORT_PIDFD support was added in v5.15-rc1 in af579beb666a > + * ("fanotify: add pidfd support to the fanotify API"). > */ > > #define _GNU_SOURCE > @@ -56,7 +59,7 @@ struct test_case_t { > > static int fanotify_fd; > static char event_buf[BUF_SZ]; > -static struct pidfd_fdinfo_t *self_pidfd_fdinfo = NULL; > +static struct pidfd_fdinfo_t *self_pidfd_fdinfo; > > static struct pidfd_fdinfo_t *read_pidfd_fdinfo(int pidfd) > { > @@ -158,7 +161,7 @@ static void do_test(unsigned int num) > * buffer. > */ > len = SAFE_READ(0, fanotify_fd, event_buf, sizeof(event_buf)); > - while(i < len) { > + while (i < len) { > struct fanotify_event_metadata *event; > struct fanotify_event_info_pidfd *info; > struct pidfd_fdinfo_t *event_pidfd_fdinfo = NULL; > @@ -197,7 +200,7 @@ static void do_test(unsigned int num) > tst_res(TFAIL, > "pidfd creation failed for pid: %u with pidfd error value " > "set to: %d", > - (unsigned)event->pid, > + (unsigned int)event->pid, > info->pidfd); > goto next_event; > } else if (tc->want_pidfd_err && > @@ -205,14 +208,14 @@ static void do_test(unsigned int num) > tst_res(TFAIL, > "pidfd set to an unexpected error: %d for pid: %u", > info->pidfd, > - (unsigned)event->pid); > + (unsigned int)event->pid); > goto next_event; > } else if (tc->want_pidfd_err && > info->pidfd == tc->want_pidfd_err) { > tst_res(TPASS, > "pid: %u terminated before pidfd was created, " > "pidfd set to the value of: %d, as expected", > - (unsigned)event->pid, > + (unsigned int)event->pid, > FAN_NOPIDFD); > goto next_event; > } > @@ -227,15 +230,15 @@ static void do_test(unsigned int num) > "reading fdinfo for pidfd: %d " > "describing pid: %u failed", > info->pidfd, > - (unsigned)event->pid); > + (unsigned int)event->pid); > goto next_event; > } else if (event_pidfd_fdinfo->pid != event->pid) { > tst_res(TFAIL, > "pidfd provided for incorrect pid " > "(expected pidfd for pid: %u, got pidfd for " > "pid: %u)", > - (unsigned)event->pid, > - (unsigned)event_pidfd_fdinfo->pid); > + (unsigned int)event->pid, > + (unsigned int)event_pidfd_fdinfo->pid); > goto next_event; > } else if (memcmp(event_pidfd_fdinfo, self_pidfd_fdinfo, > sizeof(struct pidfd_fdinfo_t))) { > @@ -261,7 +264,7 @@ static void do_test(unsigned int num) > "mask: %lld, pid: %u, fd: %d, " > "pidfd: %d, info_type: %d, info_len: %d", > (unsigned long long)event->mask, > - (unsigned)event->pid, > + (unsigned int)event->pid, > event->fd, > info->pidfd, > info->hdr.info_type, /M -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) 2021-11-16 1:06 ` Matthew Bobrowski via ltp @ 2021-11-16 9:39 ` Petr Vorel 0 siblings, 0 replies; 8+ messages in thread From: Petr Vorel @ 2021-11-16 9:39 UTC (permalink / raw) To: Matthew Bobrowski; +Cc: Jan Kara, LTP List Hi Matthew, Amir, > On Mon, Nov 15, 2021 at 10:20:18PM +0100, Petr Vorel wrote: > > Hi Matthew, Amir, > > Tested on two distro kernels with support (Tumbleweed and Debian unstable) > > + on various old kernels without support. > > Merged with very minor fixes, see diff below. > Noted the changes, they're fine by me. Thanks for the merge! +1 > > NOTE: we now support basic static analysis + checkpatch formatting check - run > > make check in fanotify directory or make check-fanotify20. > Oh, that's great, I had no idea. Quickly running it, looks like > there's a bunch of clean up required for some of the older tests. Will > have to get around to doing that at some point. Thanks a lot, that's really appreciated. Also, thanks a lot you and Amir for really maintaining fanotify tests. Kind regards, Petr -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply [flat|nested] 8+ messages in thread
* [LTP] [PATCH v3 2/3] syscalls/fanotify20: add new test for FAN_REPORT_PIDFD 2021-11-09 10:04 [LTP] [PATCH v3 0/3] Add test support for the new fanotify FAN_REPORT_PIDFD feature Matthew Bobrowski via ltp 2021-11-09 10:04 ` [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) Matthew Bobrowski via ltp @ 2021-11-09 10:05 ` Matthew Bobrowski via ltp 2021-11-09 10:05 ` [LTP] [PATCH v3 3/3] syscalls/fanotify21: test returned pidfd from fanotify in FAN_REPORT_PIDFD mode Matthew Bobrowski via ltp 2 siblings, 0 replies; 8+ messages in thread From: Matthew Bobrowski via ltp @ 2021-11-09 10:05 UTC (permalink / raw) To: ltp; +Cc: jack This test ensures that the fanotify API returns the expected error status code -EINVAL when an invalid flag is supplied alongside the new FAN_REPORT_PIDFD initialization flag. Currently, FAN_REPORT_TID is the only initialization flag that is not permitted in conjunction with FAN_REPORT_PIDFD, so we explicitly provide test coverage for this. We also add an extra trivial test case to ensure that the initialization behavior with the other FAN_REPORT_* related flags is working as intended. Signed-off-by: Matthew Bobrowski <repnop@google.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> --- testcases/kernel/syscalls/fanotify/.gitignore | 1 + testcases/kernel/syscalls/fanotify/fanotify.h | 21 +++ .../kernel/syscalls/fanotify/fanotify20.c | 128 ++++++++++++++++++ 3 files changed, 150 insertions(+) create mode 100644 testcases/kernel/syscalls/fanotify/fanotify20.c diff --git a/testcases/kernel/syscalls/fanotify/.gitignore b/testcases/kernel/syscalls/fanotify/.gitignore index 9554b16b1..c99e6fff7 100644 --- a/testcases/kernel/syscalls/fanotify/.gitignore +++ b/testcases/kernel/syscalls/fanotify/.gitignore @@ -17,4 +17,5 @@ /fanotify17 /fanotify18 /fanotify19 +/fanotify20 /fanotify_child diff --git a/testcases/kernel/syscalls/fanotify/fanotify.h b/testcases/kernel/syscalls/fanotify/fanotify.h index e2db3c6f5..c91162d97 100644 --- a/testcases/kernel/syscalls/fanotify/fanotify.h +++ b/testcases/kernel/syscalls/fanotify/fanotify.h @@ -78,6 +78,9 @@ static inline int safe_fanotify_mark(const char *file, const int lineno, #define FAN_REPORT_NAME 0x00000800 #define FAN_REPORT_DFID_NAME (FAN_REPORT_DIR_FID | FAN_REPORT_NAME) #endif +#ifndef FAN_REPORT_PIDFD +#define FAN_REPORT_PIDFD 0x00000080 +#endif /* Non-uapi convenience macros */ #ifndef FAN_REPORT_DFID_NAME_FID @@ -125,6 +128,14 @@ static inline int safe_fanotify_mark(const char *file, const int lineno, #define FAN_OPEN_EXEC_PERM 0x00040000 #endif +/* Additional error status codes that can be returned to userspace */ +#ifndef FAN_NOPIDFD +#define FAN_NOPIDFD -1 +#endif +#ifndef FAN_EPIDFD +#define FAN_EPIDFD -2 +#endif + /* Flags required for unprivileged user group */ #define FANOTIFY_REQUIRED_USER_INIT_FLAGS (FAN_REPORT_FID) @@ -164,6 +175,9 @@ typedef struct { #ifndef FAN_EVENT_INFO_TYPE_DFID #define FAN_EVENT_INFO_TYPE_DFID 3 #endif +#ifndef FAN_EVENT_INFO_TYPE_PIDFD +#define FAN_EVENT_INFO_TYPE_PIDFD 4 +#endif #ifndef HAVE_STRUCT_FANOTIFY_EVENT_INFO_HEADER struct fanotify_event_info_header { @@ -181,6 +195,13 @@ struct fanotify_event_info_fid { }; #endif /* HAVE_STRUCT_FANOTIFY_EVENT_INFO_FID */ +#ifndef HAVE_STRUCT_FANOTIFY_EVENT_INFO_PIDFD +struct fanotify_event_info_pidfd { + struct fanotify_event_info_header hdr; + int32_t pidfd; +}; +#endif /* HAVE_STRUCT_FANOTIFY_EVENT_INFO_PIDFD */ + /* NOTE: only for struct fanotify_event_info_fid */ #ifdef HAVE_STRUCT_FANOTIFY_EVENT_INFO_FID_FSID___VAL # define FSID_VAL_MEMBER(fsid, i) (fsid.__val[i]) diff --git a/testcases/kernel/syscalls/fanotify/fanotify20.c b/testcases/kernel/syscalls/fanotify/fanotify20.c new file mode 100644 index 000000000..9960d85eb --- /dev/null +++ b/testcases/kernel/syscalls/fanotify/fanotify20.c @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2021 Google. All Rights Reserved. + * + * Started by Matthew Bobrowski <repnop@google.com> + */ + +/*\ + * [Description] + * + * This source file contains a test case which ensures that the fanotify API + * returns an expected error code when provided an invalid initialization flag + * alongside FAN_REPORT_PIDFD. Additionally, it checks that the operability with + * existing FAN_REPORT_* flags is maintained and functioning as intended. + */ + +#define _GNU_SOURCE +#include "tst_test.h" +#include <errno.h> + +#ifdef HAVE_SYS_FANOTIFY_H +#include "fanotify.h" + +#define MOUNT_PATH "fs_mnt" + +static int fanotify_fd; + +static struct test_case_t { + char *name; + unsigned int init_flags; + int want_err; + int want_errno; +} test_cases[] = { + { + "fail on FAN_REPORT_PIDFD | FAN_REPORT_TID", + FAN_REPORT_PIDFD | FAN_REPORT_TID, + 1, + EINVAL, + }, + { + "pass on FAN_REPORT_PIDFD | FAN_REPORT_FID | FAN_REPORT_DFID_NAME", + FAN_REPORT_PIDFD | FAN_REPORT_FID | FAN_REPORT_DFID_NAME , + 0, + 0, + }, +}; + +static void do_setup(void) +{ + /* + * An explicit check for FAN_REPORT_PIDFD is performed early on in the + * test initialization as it's a prerequisite for all test cases. + */ + REQUIRE_FANOTIFY_INIT_FLAGS_SUPPORTED_BY_KERNEL(FAN_REPORT_PIDFD); +} + +static void do_test(unsigned int num) +{ + struct test_case_t *tc = &test_cases[num]; + + tst_res(TINFO, "Test #%d: %s", num, tc->name); + + fanotify_fd = fanotify_init(tc->init_flags, O_RDONLY); + if (fanotify_fd < 0) { + if (!tc->want_err) { + tst_res(TFAIL, + "fanotify_fd=%d, fanotify_init(%x, O_RDONLY) " + "failed with error -%d but wanted success", + fanotify_fd, tc->init_flags, errno); + return; + } + + if (errno != tc->want_errno) { + tst_res(TFAIL, + "fanotify_fd=%d, fanotify_init(%x, O_RDONLY) " + "failed with an unexpected error code -%d but " + "wanted -%d", + fanotify_fd, tc->init_flags, + errno, tc->want_errno); + return; + } + + tst_res(TPASS, + "fanotify_fd=%d, fanotify_init(%x, O_RDONLY) " + "failed with error -%d as expected", + fanotify_fd, tc->init_flags, errno); + return; + } + + /* + * Catch test cases that had expected to receive an error upon calling + * fanotify_init() but had unexpectedly resulted in a success. + */ + if (tc->want_err) { + tst_res(TFAIL, + "fanotify_fd=%d, fanotify_init(%x, O_RDONLY) " + "unexpectedly returned successfully, wanted error -%d", + fanotify_fd, tc->init_flags, tc->want_errno); + return; + } + + tst_res(TPASS, + "fanotify_fd=%d, fanotify_init(%x, O_RDONLY) " + "successfully initialized notification group", + fanotify_fd, tc->init_flags); + + SAFE_CLOSE(fanotify_fd); +} + +static void do_cleanup(void) +{ + if (fanotify_fd >= 0) + SAFE_CLOSE(fanotify_fd); +} + +static struct tst_test test = { + .setup = do_setup, + .test = do_test, + .tcnt = ARRAY_SIZE(test_cases), + .cleanup = do_cleanup, + .all_filesystems = 1, + .needs_root = 1, + .mntpoint = MOUNT_PATH, +}; + +#else + TST_TEST_TCONF("system doesn't have required fanotify support"); +#endif /* HAVE_SYS_FANOTIFY_H */ -- 2.34.0.rc0.344.g81b53c2807-goog /M -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [LTP] [PATCH v3 3/3] syscalls/fanotify21: test returned pidfd from fanotify in FAN_REPORT_PIDFD mode 2021-11-09 10:04 [LTP] [PATCH v3 0/3] Add test support for the new fanotify FAN_REPORT_PIDFD feature Matthew Bobrowski via ltp 2021-11-09 10:04 ` [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) Matthew Bobrowski via ltp 2021-11-09 10:05 ` [LTP] [PATCH v3 2/3] syscalls/fanotify20: add new test for FAN_REPORT_PIDFD Matthew Bobrowski via ltp @ 2021-11-09 10:05 ` Matthew Bobrowski via ltp 2 siblings, 0 replies; 8+ messages in thread From: Matthew Bobrowski via ltp @ 2021-11-09 10:05 UTC (permalink / raw) To: ltp; +Cc: jack This is a new test that performs verification on the values returned within the struct fanotify_event_info_pidfd record when the notification group has been initialized with the FAN_REPORT_PIDFD flag. Signed-off-by: Matthew Bobrowski <repnop@google.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> --- testcases/kernel/syscalls/fanotify/.gitignore | 1 + .../kernel/syscalls/fanotify/fanotify21.c | 306 ++++++++++++++++++ 2 files changed, 307 insertions(+) create mode 100644 testcases/kernel/syscalls/fanotify/fanotify21.c diff --git a/testcases/kernel/syscalls/fanotify/.gitignore b/testcases/kernel/syscalls/fanotify/.gitignore index c99e6fff7..35e73b91e 100644 --- a/testcases/kernel/syscalls/fanotify/.gitignore +++ b/testcases/kernel/syscalls/fanotify/.gitignore @@ -18,4 +18,5 @@ /fanotify18 /fanotify19 /fanotify20 +/fanotify21 /fanotify_child diff --git a/testcases/kernel/syscalls/fanotify/fanotify21.c b/testcases/kernel/syscalls/fanotify/fanotify21.c new file mode 100644 index 000000000..e842dad17 --- /dev/null +++ b/testcases/kernel/syscalls/fanotify/fanotify21.c @@ -0,0 +1,306 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2021 Google. All Rights Reserved. + * + * Started by Matthew Bobrowski <repnop@google.com> + */ + +/*\ + * [Description] + * + * A test which verifies whether the returned struct + * fanotify_event_info_pidfd in FAN_REPORT_PIDFD mode contains the + * expected set of information. + */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include "tst_test.h" +#include "tst_safe_stdio.h" +#include "lapi/pidfd_open.h" + +#ifdef HAVE_SYS_FANOTIFY_H +#include "fanotify.h" + +#define BUF_SZ 4096 +#define MOUNT_PATH "fs_mnt" +#define TEST_FILE MOUNT_PATH "/testfile" + +struct pidfd_fdinfo_t { + int pos; + int flags; + int mnt_id; + int pid; + int ns_pid; +}; + +struct test_case_t { + char *name; + int fork; + int want_pidfd_err; +} test_cases[] = { + { + "return a valid pidfd for event created by self", + 0, + 0, + }, + { + "return invalid pidfd for event created by terminated child", + 1, + FAN_NOPIDFD, + }, +}; + +static int fanotify_fd; +static char event_buf[BUF_SZ]; +static struct pidfd_fdinfo_t *self_pidfd_fdinfo = NULL; + +static struct pidfd_fdinfo_t *read_pidfd_fdinfo(int pidfd) +{ + char *fdinfo_path; + struct pidfd_fdinfo_t *pidfd_fdinfo; + + pidfd_fdinfo = SAFE_MALLOC(sizeof(struct pidfd_fdinfo_t)); + + SAFE_ASPRINTF(&fdinfo_path, "/proc/self/fdinfo/%d", pidfd); + SAFE_FILE_LINES_SCANF(fdinfo_path, "pos: %d", &pidfd_fdinfo->pos); + SAFE_FILE_LINES_SCANF(fdinfo_path, "flags: %d", &pidfd_fdinfo->flags); + SAFE_FILE_LINES_SCANF(fdinfo_path, "mnt_id: %d", &pidfd_fdinfo->mnt_id); + SAFE_FILE_LINES_SCANF(fdinfo_path, "Pid: %d", &pidfd_fdinfo->pid); + SAFE_FILE_LINES_SCANF(fdinfo_path, "NSpid: %d", &pidfd_fdinfo->ns_pid); + + free(fdinfo_path); + + return pidfd_fdinfo; +} + +static void generate_event(void) +{ + int fd; + + /* Generate a single FAN_OPEN event on the watched object. */ + fd = SAFE_OPEN(TEST_FILE, O_RDONLY); + SAFE_CLOSE(fd); +} + +static void do_fork(void) +{ + int status; + pid_t child; + + child = SAFE_FORK(); + if (child == 0) { + SAFE_CLOSE(fanotify_fd); + generate_event(); + exit(EXIT_SUCCESS); + } + + SAFE_WAITPID(child, &status, 0); + if (WIFEXITED(status) && WEXITSTATUS(status) != 0) + tst_brk(TBROK, + "child process terminated incorrectly"); +} + +static void do_setup(void) +{ + int pidfd; + + SAFE_TOUCH(TEST_FILE, 0666, NULL); + + /* + * An explicit check for FAN_REPORT_PIDFD is performed early + * on in the test initialization as it's a prerequisite for + * all test cases. + */ + REQUIRE_FANOTIFY_INIT_FLAGS_SUPPORTED_BY_KERNEL(FAN_REPORT_PIDFD); + + fanotify_fd = SAFE_FANOTIFY_INIT(FAN_REPORT_PIDFD, O_RDONLY); + SAFE_FANOTIFY_MARK(fanotify_fd, FAN_MARK_ADD, FAN_OPEN, AT_FDCWD, + TEST_FILE); + + pidfd = pidfd_open(getpid(), 0); + if (pidfd < 0) { + tst_brk(TBROK | TERRNO, + "pidfd=%d, pidfd_open(%d, 0) failed", + pidfd, getpid()); + } + + self_pidfd_fdinfo = read_pidfd_fdinfo(pidfd); + if (self_pidfd_fdinfo == NULL) { + tst_brk(TBROK, + "pidfd=%d, failed to read pidfd fdinfo", + pidfd); + } +} + +static void do_test(unsigned int num) +{ + int i = 0, len; + struct test_case_t *tc = &test_cases[num]; + + tst_res(TINFO, "Test #%d: %s", num, tc->name); + + /* + * Generate the event in either self or a child process. Event + * generation in a child process is done so that the FAN_NOPIDFD case + * can be verified. + */ + if (tc->fork) + do_fork(); + else + generate_event(); + + /* + * Read all of the queued events into the provided event + * buffer. + */ + len = SAFE_READ(0, fanotify_fd, event_buf, sizeof(event_buf)); + while(i < len) { + struct fanotify_event_metadata *event; + struct fanotify_event_info_pidfd *info; + struct pidfd_fdinfo_t *event_pidfd_fdinfo = NULL; + + event = (struct fanotify_event_metadata *)&event_buf[i]; + info = (struct fanotify_event_info_pidfd *)(event + 1); + + /* + * Checks ensuring that pidfd information record object header + * fields are set correctly. + */ + if (info->hdr.info_type != FAN_EVENT_INFO_TYPE_PIDFD) { + tst_res(TFAIL, + "unexpected info_type received in info " + "header (expected: %d, got: %d", + FAN_EVENT_INFO_TYPE_PIDFD, + info->hdr.info_type); + info = NULL; + goto next_event; + } else if (info->hdr.len != + sizeof(struct fanotify_event_info_pidfd)) { + tst_res(TFAIL, + "unexpected info object length " + "(expected: %lu, got: %d", + sizeof(struct fanotify_event_info_pidfd), + info->hdr.len); + info = NULL; + goto next_event; + } + + /* + * Check if pidfd information object reported any errors during + * creation and whether they're expected. + */ + if (info->pidfd < 0 && !tc->want_pidfd_err) { + tst_res(TFAIL, + "pidfd creation failed for pid: %u with pidfd error value " + "set to: %d", + (unsigned)event->pid, + info->pidfd); + goto next_event; + } else if (tc->want_pidfd_err && + info->pidfd != tc->want_pidfd_err) { + tst_res(TFAIL, + "pidfd set to an unexpected error: %d for pid: %u", + info->pidfd, + (unsigned)event->pid); + goto next_event; + } else if (tc->want_pidfd_err && + info->pidfd == tc->want_pidfd_err) { + tst_res(TPASS, + "pid: %u terminated before pidfd was created, " + "pidfd set to the value of: %d, as expected", + (unsigned)event->pid, + FAN_NOPIDFD); + goto next_event; + } + + /* + * No pidfd errors occurred, continue with verifying pidfd + * fdinfo validity. + */ + event_pidfd_fdinfo = read_pidfd_fdinfo(info->pidfd); + if (event_pidfd_fdinfo == NULL) { + tst_brk(TBROK, + "reading fdinfo for pidfd: %d " + "describing pid: %u failed", + info->pidfd, + (unsigned)event->pid); + goto next_event; + } else if (event_pidfd_fdinfo->pid != event->pid) { + tst_res(TFAIL, + "pidfd provided for incorrect pid " + "(expected pidfd for pid: %u, got pidfd for " + "pid: %u)", + (unsigned)event->pid, + (unsigned)event_pidfd_fdinfo->pid); + goto next_event; + } else if (memcmp(event_pidfd_fdinfo, self_pidfd_fdinfo, + sizeof(struct pidfd_fdinfo_t))) { + tst_res(TFAIL, + "pidfd fdinfo values for self and event differ " + "(expected pos: %d, flags: %x, mnt_id: %d, " + "pid: %d, ns_pid: %d, got pos: %d, " + "flags: %x, mnt_id: %d, pid: %d, ns_pid: %d", + self_pidfd_fdinfo->pos, + self_pidfd_fdinfo->flags, + self_pidfd_fdinfo->mnt_id, + self_pidfd_fdinfo->pid, + self_pidfd_fdinfo->ns_pid, + event_pidfd_fdinfo->pos, + event_pidfd_fdinfo->flags, + event_pidfd_fdinfo->mnt_id, + event_pidfd_fdinfo->pid, + event_pidfd_fdinfo->ns_pid); + goto next_event; + } else { + tst_res(TPASS, + "got an event with a valid pidfd info record, " + "mask: %lld, pid: %u, fd: %d, " + "pidfd: %d, info_type: %d, info_len: %d", + (unsigned long long)event->mask, + (unsigned)event->pid, + event->fd, + info->pidfd, + info->hdr.info_type, + info->hdr.len); + } + +next_event: + i += event->event_len; + if (event->fd >= 0) + SAFE_CLOSE(event->fd); + + if (info && info->pidfd >= 0) + SAFE_CLOSE(info->pidfd); + + if (event_pidfd_fdinfo) + free(event_pidfd_fdinfo); + } +} + +static void do_cleanup(void) +{ + if (fanotify_fd >= 0) + SAFE_CLOSE(fanotify_fd); + + if (self_pidfd_fdinfo) + free(self_pidfd_fdinfo); +} + +static struct tst_test test = { + .setup = do_setup, + .test = do_test, + .tcnt = ARRAY_SIZE(test_cases), + .cleanup = do_cleanup, + .all_filesystems = 1, + .needs_root = 1, + .mntpoint = MOUNT_PATH, + .forks_child = 1, +}; + +#else + TST_TEST_TCONF("system doesn't have required fanotify support"); +#endif /* HAVE_SYS_FANOTIFY_H */ -- 2.34.0.rc0.344.g81b53c2807-goog /M -- Mailing list info: https://lists.linux.it/listinfo/ltp ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-11-16 9:39 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-11-09 10:04 [LTP] [PATCH v3 0/3] Add test support for the new fanotify FAN_REPORT_PIDFD feature Matthew Bobrowski via ltp 2021-11-09 10:04 ` [LTP] [PATCH v3 1/3] syscalls/fanotify: Add a helper macro which checks for the presence of specific fanotify initialization flag(s) Matthew Bobrowski via ltp 2021-11-09 11:05 ` Amir Goldstein 2021-11-15 21:20 ` Petr Vorel 2021-11-16 1:06 ` Matthew Bobrowski via ltp 2021-11-16 9:39 ` Petr Vorel 2021-11-09 10:05 ` [LTP] [PATCH v3 2/3] syscalls/fanotify20: add new test for FAN_REPORT_PIDFD Matthew Bobrowski via ltp 2021-11-09 10:05 ` [LTP] [PATCH v3 3/3] syscalls/fanotify21: test returned pidfd from fanotify in FAN_REPORT_PIDFD mode Matthew Bobrowski via ltp
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox