diff mbox series

fanotify14: Test disallow sb/mount mark on anonymous pipe

Message ID 20230710141403.1155151-1-amir73il@gmail.com
State Changes Requested
Headers show
Series fanotify14: Test disallow sb/mount mark on anonymous pipe | expand

Commit Message

Amir Goldstein July 10, 2023, 2:14 p.m. UTC
This case was retroactively disallowed.

This test is meant to encourage the backporting of commit 69562eb0bd3e
("fanotify: disallow mount/sb marks on kernel internal pseudo fs") to
all stable kernels.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---

Petr,

This tests for a behavior that we consider broken since the dawn of
fanotify.

The fix was merged to v6.5-rc1.
I've already posted backport patches for kernels > v5.0.
I am not planning to post backport patches for older kernels.

Even though the two new test cases do not use FAN_REPORT_FID,
fanotify14 requires FAN_REPORT_FID, so it is not going to run these
test cases on kernel < v5.1 anyway.

Thanks,
Amir.

 .../kernel/syscalls/fanotify/fanotify14.c     | 32 +++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

Comments

Petr Vorel July 10, 2023, 3:50 p.m. UTC | #1
Hi Amir,

> This case was retroactively disallowed.

> This test is meant to encourage the backporting of commit 69562eb0bd3e
> ("fanotify: disallow mount/sb marks on kernel internal pseudo fs") to
> all stable kernels.

> Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> ---

> Petr,

> This tests for a behavior that we consider broken since the dawn of
> fanotify.

> The fix was merged to v6.5-rc1.
> I've already posted backport patches for kernels > v5.0.
> I am not planning to post backport patches for older kernels.

I see
https://lore.kernel.org/stable/20230710133205.1154168-1-amir73il@gmail.com/

I'll suggest to wait till Greg releases the backport (should be quick enough).

> Even though the two new test cases do not use FAN_REPORT_FID,
> fanotify14 requires FAN_REPORT_FID, so it is not going to run these
> test cases on kernel < v5.1 anyway.

> Thanks,
> Amir.

>  .../kernel/syscalls/fanotify/fanotify14.c     | 32 +++++++++++++++++--
>  1 file changed, 30 insertions(+), 2 deletions(-)

> diff --git a/testcases/kernel/syscalls/fanotify/fanotify14.c b/testcases/kernel/syscalls/fanotify/fanotify14.c
> index bfa0349fe..063a9f96f 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify14.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify14.c
> @@ -19,6 +19,9 @@
>   *
>   *     ceaf69f8eadc fanotify: do not allow setting dirent events in mask of non-dir
>   *     8698e3bab4dd fanotify: refine the validation checks on non-dir inode mask
> + *
> + * The pipes test cases are regression tests for commit:
> + *     69562eb0bd3e fanotify: disallow mount/sb marks on kernel internal pseudo fs
>   */

>  #define _GNU_SOURCE
> @@ -40,6 +43,7 @@

>  #define FLAGS_DESC(flags) {(flags), (#flags)}

> +static int pipes[2] = {-1, -1};
>  static int fanotify_fd;
>  static int fan_report_target_fid_unsupported;
>  static int ignore_mark_unsupported;
> @@ -60,6 +64,7 @@ static struct test_case_t {
>  	/* when mask.flags == 0, fanotify_init() is expected to fail */
>  	struct test_case_flags_t mask;
>  	int expected_errno;
> +	int *pfd;

This produces warnings:
fanotify14.c:70:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
   70 |         {FLAGS_DESC(FAN_CLASS_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
      |         ^
fanotify14.c:67:14: note: ‘pfd’ declared here
   67 |         int *pfd;
      |              ^~~
fanotify14.c:73:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
   73 |         {FLAGS_DESC(FAN_CLASS_PRE_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
      |         ^
fanotify14.c:67:14: note: ‘pfd’ declared here
   67 |         int *pfd;
      |              ^~~

Could you please fix them? I guess pfd must be NULL when unused.

The rest LGTM.

Kind regards,
Petr

...
Amir Goldstein July 10, 2023, 6:32 p.m. UTC | #2
On Mon, Jul 10, 2023 at 6:50 PM Petr Vorel <pvorel@suse.cz> wrote:
>
> Hi Amir,
>
> > This case was retroactively disallowed.
>
> > This test is meant to encourage the backporting of commit 69562eb0bd3e
> > ("fanotify: disallow mount/sb marks on kernel internal pseudo fs") to
> > all stable kernels.
>
> > Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> > ---
>
> > Petr,
>
> > This tests for a behavior that we consider broken since the dawn of
> > fanotify.
>
> > The fix was merged to v6.5-rc1.
> > I've already posted backport patches for kernels > v5.0.
> > I am not planning to post backport patches for older kernels.
>
> I see
> https://lore.kernel.org/stable/20230710133205.1154168-1-amir73il@gmail.com/
>
> I'll suggest to wait till Greg releases the backport (should be quick enough).
>

ok.

> > Even though the two new test cases do not use FAN_REPORT_FID,
> > fanotify14 requires FAN_REPORT_FID, so it is not going to run these
> > test cases on kernel < v5.1 anyway.
>
> > Thanks,
> > Amir.
>
> >  .../kernel/syscalls/fanotify/fanotify14.c     | 32 +++++++++++++++++--
> >  1 file changed, 30 insertions(+), 2 deletions(-)
>
> > diff --git a/testcases/kernel/syscalls/fanotify/fanotify14.c b/testcases/kernel/syscalls/fanotify/fanotify14.c
> > index bfa0349fe..063a9f96f 100644
> > --- a/testcases/kernel/syscalls/fanotify/fanotify14.c
> > +++ b/testcases/kernel/syscalls/fanotify/fanotify14.c
> > @@ -19,6 +19,9 @@
> >   *
> >   *     ceaf69f8eadc fanotify: do not allow setting dirent events in mask of non-dir
> >   *     8698e3bab4dd fanotify: refine the validation checks on non-dir inode mask
> > + *
> > + * The pipes test cases are regression tests for commit:
> > + *     69562eb0bd3e fanotify: disallow mount/sb marks on kernel internal pseudo fs
> >   */
>
> >  #define _GNU_SOURCE
> > @@ -40,6 +43,7 @@
>
> >  #define FLAGS_DESC(flags) {(flags), (#flags)}
>
> > +static int pipes[2] = {-1, -1};
> >  static int fanotify_fd;
> >  static int fan_report_target_fid_unsupported;
> >  static int ignore_mark_unsupported;
> > @@ -60,6 +64,7 @@ static struct test_case_t {
> >       /* when mask.flags == 0, fanotify_init() is expected to fail */
> >       struct test_case_flags_t mask;
> >       int expected_errno;
> > +     int *pfd;
>
> This produces warnings:
> fanotify14.c:70:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
>    70 |         {FLAGS_DESC(FAN_CLASS_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
>       |         ^
> fanotify14.c:67:14: note: ‘pfd’ declared here
>    67 |         int *pfd;
>       |              ^~~
> fanotify14.c:73:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
>    73 |         {FLAGS_DESC(FAN_CLASS_PRE_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
>       |         ^
> fanotify14.c:67:14: note: ‘pfd’ declared here
>    67 |         int *pfd;
>       |              ^~~
>
> Could you please fix them? I guess pfd must be NULL when unused.
>

ok. but I have to ask,
what is the value of explicitly initializing all the old test cases to
pfd = NULL?
and what is wrong with default NULL initializers?
Is it a deliberate decision of LTP to care about this warning?
it's a classic pattern for what this patch does -
add a new field to test case which all the existing test cases
should not care about.

Also, I have always seen these warnings for struct tst_test.

fanotify14.c:284:1: warning: missing initializer for field
'needs_cmds' of 'struct tst_test' [-Wmissing-field-initializers]
  284 | };
      | ^
In file included from fanotify14.c:28:
../../../../include/tst_test.h:324:21: note: 'needs_cmds' declared here
  324 |  const char *const *needs_cmds;
      |                     ^~~~~~~~~~

Must we really initialize an empty needs_cmds array for every test?
Seems pointless to me, but I may not have the bigger picture.

Thanks,
Amir.
Petr Vorel July 11, 2023, 6:34 a.m. UTC | #3
> On Mon, Jul 10, 2023 at 6:50 PM Petr Vorel <pvorel@suse.cz> wrote:

> > Hi Amir,

> > > This case was retroactively disallowed.

> > > This test is meant to encourage the backporting of commit 69562eb0bd3e
> > > ("fanotify: disallow mount/sb marks on kernel internal pseudo fs") to
> > > all stable kernels.

> > > Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> > > ---

> > > Petr,

> > > This tests for a behavior that we consider broken since the dawn of
> > > fanotify.

> > > The fix was merged to v6.5-rc1.
> > > I've already posted backport patches for kernels > v5.0.
> > > I am not planning to post backport patches for older kernels.

> > I see
> > https://lore.kernel.org/stable/20230710133205.1154168-1-amir73il@gmail.com/

> > I'll suggest to wait till Greg releases the backport (should be quick enough).


> ok.

> > > Even though the two new test cases do not use FAN_REPORT_FID,
> > > fanotify14 requires FAN_REPORT_FID, so it is not going to run these
> > > test cases on kernel < v5.1 anyway.

> > > Thanks,
> > > Amir.

> > >  .../kernel/syscalls/fanotify/fanotify14.c     | 32 +++++++++++++++++--
> > >  1 file changed, 30 insertions(+), 2 deletions(-)

> > > diff --git a/testcases/kernel/syscalls/fanotify/fanotify14.c b/testcases/kernel/syscalls/fanotify/fanotify14.c
> > > index bfa0349fe..063a9f96f 100644
> > > --- a/testcases/kernel/syscalls/fanotify/fanotify14.c
> > > +++ b/testcases/kernel/syscalls/fanotify/fanotify14.c
> > > @@ -19,6 +19,9 @@
> > >   *
> > >   *     ceaf69f8eadc fanotify: do not allow setting dirent events in mask of non-dir
> > >   *     8698e3bab4dd fanotify: refine the validation checks on non-dir inode mask
> > > + *
> > > + * The pipes test cases are regression tests for commit:
> > > + *     69562eb0bd3e fanotify: disallow mount/sb marks on kernel internal pseudo fs
> > >   */

> > >  #define _GNU_SOURCE
> > > @@ -40,6 +43,7 @@

> > >  #define FLAGS_DESC(flags) {(flags), (#flags)}

> > > +static int pipes[2] = {-1, -1};
> > >  static int fanotify_fd;
> > >  static int fan_report_target_fid_unsupported;
> > >  static int ignore_mark_unsupported;
> > > @@ -60,6 +64,7 @@ static struct test_case_t {
> > >       /* when mask.flags == 0, fanotify_init() is expected to fail */
> > >       struct test_case_flags_t mask;
> > >       int expected_errno;
> > > +     int *pfd;

> > This produces warnings:
> > fanotify14.c:70:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
> >    70 |         {FLAGS_DESC(FAN_CLASS_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
> >       |         ^
> > fanotify14.c:67:14: note: ‘pfd’ declared here
> >    67 |         int *pfd;
> >       |              ^~~
> > fanotify14.c:73:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
> >    73 |         {FLAGS_DESC(FAN_CLASS_PRE_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
> >       |         ^
> > fanotify14.c:67:14: note: ‘pfd’ declared here
> >    67 |         int *pfd;
> >       |              ^~~

> > Could you please fix them? I guess pfd must be NULL when unused.


> ok. but I have to ask,
> what is the value of explicitly initializing all the old test cases to
> pfd = NULL?
> and what is wrong with default NULL initializers?
> Is it a deliberate decision of LTP to care about this warning?
> it's a classic pattern for what this patch does -
> add a new field to test case which all the existing test cases
> should not care about.

Well, we try to avoid warnings in new API tests (and rewriting legacy API tests
into new API to cleanup the code).

The solution to avoid warnings is to use designated initializers (named
initializers), the same way as in ede7f095e ("fanotify10: Use named
initializers"):

	/* FAN_REPORT_FID without class FAN_CLASS_NOTIF is not valid */
	{
		.init = FLAGS_DESC(FAN_CLASS_CONTENT | FAN_REPORT_FID),
		.expected_errno = EINVAL
	},

	/* FAN_REPORT_FID without class FAN_CLASS_NOTIF is not valid */
	{
		.init = FLAGS_DESC(FAN_CLASS_PRE_CONTENT | FAN_REPORT_FID),
		.expected_errno = EINVAL
	},

	...
	{
		.init = FLAGS_DESC(FAN_CLASS_NOTIF),
		.mark = FLAGS_DESC(FAN_MARK_FILESYSTEM),
		.mask = { FAN_ACCESS, "anonymous pipe"},
		.expected_errno = EINVAL,
		.pfd = pipes
	},

The last one could be without designated initializers, because we pass all
struct members, but IMHO it's better for readability.

Therefore ideal solution would be to turn the test into designated initializers
in separate commit, followed by this change.

> Also, I have always seen these warnings for struct tst_test.

> fanotify14.c:284:1: warning: missing initializer for field
> 'needs_cmds' of 'struct tst_test' [-Wmissing-field-initializers]
>   284 | };
>       | ^
> In file included from fanotify14.c:28:
> ../../../../include/tst_test.h:324:21: note: 'needs_cmds' declared here
>   324 |  const char *const *needs_cmds;
>       |                     ^~~~~~~~~~

These warnings were caused by these GCC bugs (fixed in gcc 12 and backported to
gcc 11):
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84685
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82283

Kind regards,
Petr

> Must we really initialize an empty needs_cmds array for every test?
> Seems pointless to me, but I may not have the bigger picture.

> Thanks,
> Amir.
Amir Goldstein July 11, 2023, 7:37 a.m. UTC | #4
On Tue, Jul 11, 2023 at 9:34 AM Petr Vorel <pvorel@suse.cz> wrote:
>
> > On Mon, Jul 10, 2023 at 6:50 PM Petr Vorel <pvorel@suse.cz> wrote:
>
> > > Hi Amir,
>
> > > > This case was retroactively disallowed.
>
> > > > This test is meant to encourage the backporting of commit 69562eb0bd3e
> > > > ("fanotify: disallow mount/sb marks on kernel internal pseudo fs") to
> > > > all stable kernels.
>
> > > > Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> > > > ---
>
> > > > Petr,
>
> > > > This tests for a behavior that we consider broken since the dawn of
> > > > fanotify.
>
> > > > The fix was merged to v6.5-rc1.
> > > > I've already posted backport patches for kernels > v5.0.
> > > > I am not planning to post backport patches for older kernels.
>
> > > I see
> > > https://lore.kernel.org/stable/20230710133205.1154168-1-amir73il@gmail.com/
>
> > > I'll suggest to wait till Greg releases the backport (should be quick enough).
>
>
> > ok.
>
> > > > Even though the two new test cases do not use FAN_REPORT_FID,
> > > > fanotify14 requires FAN_REPORT_FID, so it is not going to run these
> > > > test cases on kernel < v5.1 anyway.
>
> > > > Thanks,
> > > > Amir.
>
> > > >  .../kernel/syscalls/fanotify/fanotify14.c     | 32 +++++++++++++++++--
> > > >  1 file changed, 30 insertions(+), 2 deletions(-)
>
> > > > diff --git a/testcases/kernel/syscalls/fanotify/fanotify14.c b/testcases/kernel/syscalls/fanotify/fanotify14.c
> > > > index bfa0349fe..063a9f96f 100644
> > > > --- a/testcases/kernel/syscalls/fanotify/fanotify14.c
> > > > +++ b/testcases/kernel/syscalls/fanotify/fanotify14.c
> > > > @@ -19,6 +19,9 @@
> > > >   *
> > > >   *     ceaf69f8eadc fanotify: do not allow setting dirent events in mask of non-dir
> > > >   *     8698e3bab4dd fanotify: refine the validation checks on non-dir inode mask
> > > > + *
> > > > + * The pipes test cases are regression tests for commit:
> > > > + *     69562eb0bd3e fanotify: disallow mount/sb marks on kernel internal pseudo fs
> > > >   */
>
> > > >  #define _GNU_SOURCE
> > > > @@ -40,6 +43,7 @@
>
> > > >  #define FLAGS_DESC(flags) {(flags), (#flags)}
>
> > > > +static int pipes[2] = {-1, -1};
> > > >  static int fanotify_fd;
> > > >  static int fan_report_target_fid_unsupported;
> > > >  static int ignore_mark_unsupported;
> > > > @@ -60,6 +64,7 @@ static struct test_case_t {
> > > >       /* when mask.flags == 0, fanotify_init() is expected to fail */
> > > >       struct test_case_flags_t mask;
> > > >       int expected_errno;
> > > > +     int *pfd;
>
> > > This produces warnings:
> > > fanotify14.c:70:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
> > >    70 |         {FLAGS_DESC(FAN_CLASS_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
> > >       |         ^
> > > fanotify14.c:67:14: note: ‘pfd’ declared here
> > >    67 |         int *pfd;
> > >       |              ^~~
> > > fanotify14.c:73:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
> > >    73 |         {FLAGS_DESC(FAN_CLASS_PRE_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
> > >       |         ^
> > > fanotify14.c:67:14: note: ‘pfd’ declared here
> > >    67 |         int *pfd;
> > >       |              ^~~
>
> > > Could you please fix them? I guess pfd must be NULL when unused.
>
>
> > ok. but I have to ask,
> > what is the value of explicitly initializing all the old test cases to
> > pfd = NULL?
> > and what is wrong with default NULL initializers?
> > Is it a deliberate decision of LTP to care about this warning?
> > it's a classic pattern for what this patch does -
> > add a new field to test case which all the existing test cases
> > should not care about.
>
> Well, we try to avoid warnings in new API tests (and rewriting legacy API tests
> into new API to cleanup the code).
>
> The solution to avoid warnings is to use designated initializers (named
> initializers), the same way as in ede7f095e ("fanotify10: Use named
> initializers"):
>
>         /* FAN_REPORT_FID without class FAN_CLASS_NOTIF is not valid */
>         {
>                 .init = FLAGS_DESC(FAN_CLASS_CONTENT | FAN_REPORT_FID),
>                 .expected_errno = EINVAL
>         },
>
>         /* FAN_REPORT_FID without class FAN_CLASS_NOTIF is not valid */
>         {
>                 .init = FLAGS_DESC(FAN_CLASS_PRE_CONTENT | FAN_REPORT_FID),
>                 .expected_errno = EINVAL
>         },
>
>         ...
>         {
>                 .init = FLAGS_DESC(FAN_CLASS_NOTIF),
>                 .mark = FLAGS_DESC(FAN_MARK_FILESYSTEM),
>                 .mask = { FAN_ACCESS, "anonymous pipe"},
>                 .expected_errno = EINVAL,
>                 .pfd = pipes
>         },
>
> The last one could be without designated initializers, because we pass all
> struct members, but IMHO it's better for readability.
>
> Therefore ideal solution would be to turn the test into designated initializers
> in separate commit, followed by this change.
>

Ah yes, I remember now. Will do that.

> > Also, I have always seen these warnings for struct tst_test.
>
> > fanotify14.c:284:1: warning: missing initializer for field
> > 'needs_cmds' of 'struct tst_test' [-Wmissing-field-initializers]
> >   284 | };
> >       | ^
> > In file included from fanotify14.c:28:
> > ../../../../include/tst_test.h:324:21: note: 'needs_cmds' declared here
> >   324 |  const char *const *needs_cmds;
> >       |                     ^~~~~~~~~~
>
> These warnings were caused by these GCC bugs (fixed in gcc 12 and backported to
> gcc 11):
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84685
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82283
>

Good to know.
Thanks!

Amir.
Petr Vorel July 11, 2023, 8:05 a.m. UTC | #5
> On Tue, Jul 11, 2023 at 9:34 AM Petr Vorel <pvorel@suse.cz> wrote:

> > > On Mon, Jul 10, 2023 at 6:50 PM Petr Vorel <pvorel@suse.cz> wrote:

> > > > Hi Amir,

> > > > > This case was retroactively disallowed.

> > > > > This test is meant to encourage the backporting of commit 69562eb0bd3e
> > > > > ("fanotify: disallow mount/sb marks on kernel internal pseudo fs") to
> > > > > all stable kernels.

> > > > > Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> > > > > ---

> > > > > Petr,

> > > > > This tests for a behavior that we consider broken since the dawn of
> > > > > fanotify.

> > > > > The fix was merged to v6.5-rc1.
> > > > > I've already posted backport patches for kernels > v5.0.
> > > > > I am not planning to post backport patches for older kernels.

> > > > I see
> > > > https://lore.kernel.org/stable/20230710133205.1154168-1-amir73il@gmail.com/

> > > > I'll suggest to wait till Greg releases the backport (should be quick enough).


> > > ok.

> > > > > Even though the two new test cases do not use FAN_REPORT_FID,
> > > > > fanotify14 requires FAN_REPORT_FID, so it is not going to run these
> > > > > test cases on kernel < v5.1 anyway.

> > > > > Thanks,
> > > > > Amir.

> > > > >  .../kernel/syscalls/fanotify/fanotify14.c     | 32 +++++++++++++++++--
> > > > >  1 file changed, 30 insertions(+), 2 deletions(-)

> > > > > diff --git a/testcases/kernel/syscalls/fanotify/fanotify14.c b/testcases/kernel/syscalls/fanotify/fanotify14.c
> > > > > index bfa0349fe..063a9f96f 100644
> > > > > --- a/testcases/kernel/syscalls/fanotify/fanotify14.c
> > > > > +++ b/testcases/kernel/syscalls/fanotify/fanotify14.c
> > > > > @@ -19,6 +19,9 @@
> > > > >   *
> > > > >   *     ceaf69f8eadc fanotify: do not allow setting dirent events in mask of non-dir
> > > > >   *     8698e3bab4dd fanotify: refine the validation checks on non-dir inode mask
> > > > > + *
> > > > > + * The pipes test cases are regression tests for commit:
> > > > > + *     69562eb0bd3e fanotify: disallow mount/sb marks on kernel internal pseudo fs
> > > > >   */

> > > > >  #define _GNU_SOURCE
> > > > > @@ -40,6 +43,7 @@

> > > > >  #define FLAGS_DESC(flags) {(flags), (#flags)}

> > > > > +static int pipes[2] = {-1, -1};
> > > > >  static int fanotify_fd;
> > > > >  static int fan_report_target_fid_unsupported;
> > > > >  static int ignore_mark_unsupported;
> > > > > @@ -60,6 +64,7 @@ static struct test_case_t {
> > > > >       /* when mask.flags == 0, fanotify_init() is expected to fail */
> > > > >       struct test_case_flags_t mask;
> > > > >       int expected_errno;
> > > > > +     int *pfd;

> > > > This produces warnings:
> > > > fanotify14.c:70:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
> > > >    70 |         {FLAGS_DESC(FAN_CLASS_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
> > > >       |         ^
> > > > fanotify14.c:67:14: note: ‘pfd’ declared here
> > > >    67 |         int *pfd;
> > > >       |              ^~~
> > > > fanotify14.c:73:9: warning: missing initializer for field ‘pfd’ of ‘struct test_case_t’ [-Wmissing-field-initializers]
> > > >    73 |         {FLAGS_DESC(FAN_CLASS_PRE_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
> > > >       |         ^
> > > > fanotify14.c:67:14: note: ‘pfd’ declared here
> > > >    67 |         int *pfd;
> > > >       |              ^~~

> > > > Could you please fix them? I guess pfd must be NULL when unused.


> > > ok. but I have to ask,
> > > what is the value of explicitly initializing all the old test cases to
> > > pfd = NULL?
> > > and what is wrong with default NULL initializers?
> > > Is it a deliberate decision of LTP to care about this warning?
> > > it's a classic pattern for what this patch does -
> > > add a new field to test case which all the existing test cases
> > > should not care about.

> > Well, we try to avoid warnings in new API tests (and rewriting legacy API tests
> > into new API to cleanup the code).

> > The solution to avoid warnings is to use designated initializers (named
> > initializers), the same way as in ede7f095e ("fanotify10: Use named
> > initializers"):

> >         /* FAN_REPORT_FID without class FAN_CLASS_NOTIF is not valid */
> >         {
> >                 .init = FLAGS_DESC(FAN_CLASS_CONTENT | FAN_REPORT_FID),
> >                 .expected_errno = EINVAL
> >         },

> >         /* FAN_REPORT_FID without class FAN_CLASS_NOTIF is not valid */
> >         {
> >                 .init = FLAGS_DESC(FAN_CLASS_PRE_CONTENT | FAN_REPORT_FID),
> >                 .expected_errno = EINVAL
> >         },

> >         ...
> >         {
> >                 .init = FLAGS_DESC(FAN_CLASS_NOTIF),
> >                 .mark = FLAGS_DESC(FAN_MARK_FILESYSTEM),
> >                 .mask = { FAN_ACCESS, "anonymous pipe"},
> >                 .expected_errno = EINVAL,
> >                 .pfd = pipes
> >         },

> > The last one could be without designated initializers, because we pass all
> > struct members, but IMHO it's better for readability.

> > Therefore ideal solution would be to turn the test into designated initializers
> > in separate commit, followed by this change.


> Ah yes, I remember now. Will do that.

Thanks a lot!

Kind regards,
Petr

> > > Also, I have always seen these warnings for struct tst_test.

> > > fanotify14.c:284:1: warning: missing initializer for field
> > > 'needs_cmds' of 'struct tst_test' [-Wmissing-field-initializers]
> > >   284 | };
> > >       | ^
> > > In file included from fanotify14.c:28:
> > > ../../../../include/tst_test.h:324:21: note: 'needs_cmds' declared here
> > >   324 |  const char *const *needs_cmds;
> > >       |                     ^~~~~~~~~~

> > These warnings were caused by these GCC bugs (fixed in gcc 12 and backported to
> > gcc 11):
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84685
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82283


> Good to know.
> Thanks!

> Amir.
diff mbox series

Patch

diff --git a/testcases/kernel/syscalls/fanotify/fanotify14.c b/testcases/kernel/syscalls/fanotify/fanotify14.c
index bfa0349fe..063a9f96f 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify14.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify14.c
@@ -19,6 +19,9 @@ 
  *
  *     ceaf69f8eadc fanotify: do not allow setting dirent events in mask of non-dir
  *     8698e3bab4dd fanotify: refine the validation checks on non-dir inode mask
+ *
+ * The pipes test cases are regression tests for commit:
+ *     69562eb0bd3e fanotify: disallow mount/sb marks on kernel internal pseudo fs
  */
 
 #define _GNU_SOURCE
@@ -40,6 +43,7 @@ 
 
 #define FLAGS_DESC(flags) {(flags), (#flags)}
 
+static int pipes[2] = {-1, -1};
 static int fanotify_fd;
 static int fan_report_target_fid_unsupported;
 static int ignore_mark_unsupported;
@@ -60,6 +64,7 @@  static struct test_case_t {
 	/* when mask.flags == 0, fanotify_init() is expected to fail */
 	struct test_case_flags_t mask;
 	int expected_errno;
+	int *pfd;
 } test_cases[] = {
 	/* FAN_REPORT_FID without class FAN_CLASS_NOTIF is not valid */
 	{FLAGS_DESC(FAN_CLASS_CONTENT | FAN_REPORT_FID), {}, {}, EINVAL},
@@ -148,6 +153,16 @@  static struct test_case_t {
 	{FLAGS_DESC(FAN_CLASS_NOTIF),
 		FLAGS_DESC(FAN_MARK_FILESYSTEM | FAN_MARK_IGNORE),
 		FLAGS_DESC(FAN_OPEN), EINVAL},
+
+	/* mount mark on anonymous pipe is not valid */
+	{FLAGS_DESC(FAN_CLASS_NOTIF),
+		FLAGS_DESC(FAN_MARK_MOUNT),
+		{ FAN_ACCESS, "anonymous pipe"}, EINVAL, pipes},
+
+	/* filesystem mark on anonymous pipe is not valid */
+	{FLAGS_DESC(FAN_CLASS_NOTIF),
+		FLAGS_DESC(FAN_MARK_FILESYSTEM),
+		{ FAN_ACCESS, "anonymous pipe"}, EINVAL, pipes},
 };
 
 static void do_test(unsigned int number)
@@ -185,11 +200,17 @@  static void do_test(unsigned int number)
 
 	/* Set mark on non-dir only when expecting error ENOTDIR */
 	const char *path = tc->expected_errno == ENOTDIR ? FILE1 : MNTPOINT;
+	int dirfd = AT_FDCWD;
+
+	if (tc->pfd) {
+		dirfd = tc->pfd[0];
+		path = NULL;
+	}
 
-	tst_res(TINFO, "Testing fanotify_mark(FAN_MARK_ADD | %s, %s)",
+	tst_res(TINFO, "Testing %s with %s",
 		tc->mark.desc, tc->mask.desc);
 	TST_EXP_FD_OR_FAIL(fanotify_mark(fanotify_fd, FAN_MARK_ADD | tc->mark.flags,
-					 tc->mask.flags, AT_FDCWD, path),
+					 tc->mask.flags, dirfd, path),
 					 tc->expected_errno);
 
 	/*
@@ -231,12 +252,18 @@  static void do_setup(void)
 
 	/* Create temporary test file to place marks on */
 	SAFE_FILE_PRINTF(FILE1, "0");
+	/* Create anonymous pipes to place marks on */
+	SAFE_PIPE2(pipes, O_CLOEXEC);
 }
 
 static void do_cleanup(void)
 {
 	if (fanotify_fd > 0)
 		SAFE_CLOSE(fanotify_fd);
+	if (pipes[0] != -1)
+		SAFE_CLOSE(pipes[0]);
+	if (pipes[1] != -1)
+		SAFE_CLOSE(pipes[1]);
 }
 
 static struct tst_test test = {
@@ -251,6 +278,7 @@  static struct tst_test test = {
 	.tags = (const struct tst_tag[]) {
 		{"linux-git", "ceaf69f8eadc"},
 		{"linux-git", "8698e3bab4dd"},
+		{"linux-git", "69562eb0bd3e"},
 		{}
 	}
 };