[LTP] [RFC 2/3] syscalls/fanotify03: included execve() to generate_events() to increase test coverage

Amir Goldstein amir73il@gmail.com
Thu Oct 25 08:46:15 CEST 2018


On Thu, Oct 25, 2018 at 9:39 AM Matthew Bobrowski
<mbobrowski@mbobrowski.org> wrote:
>
> On Wed, Oct 24, 2018 at 08:31:22AM +0300, Amir Goldstein wrote:
> > On Wed, Oct 24, 2018 at 6:28 AM Matthew Bobrowski
> > <mbobrowski@mbobrowski.org> wrote:
> > >
> > > * Created an executable helper program 'fanotify_child' so that can be
> > >   used within fanotify tests
> > >
> > > * Defined .resource_files so that additional test resources can be
> > >   copied across to the tmp working directory i.e. fanotify_child
> > >
> > > * Updated generate_events() so that it now includes a call to execve()
> > >   on fanotify_child. This is so that we can increase the overall test
> > >   coverage by generating more events on a watched object
> > >
> > > * Updated each tcase events[] to accommodate for the additional events
> > >   generated by execve()
> > >
> > > Signed-off-by: Matthew Bobrowski <mbobrowski@mbobrowski.org>
> > > ---
> > >  testcases/kernel/syscalls/fanotify/.gitignore |  1 +
> > >  .../kernel/syscalls/fanotify/fanotify03.c     | 83 ++++++++++++-------
> > >  .../kernel/syscalls/fanotify/fanotify_child.c | 14 ++++
> > >  3 files changed, 66 insertions(+), 32 deletions(-)
> > >  create mode 100644 testcases/kernel/syscalls/fanotify/fanotify_child.c
> > >
> > > diff --git a/testcases/kernel/syscalls/fanotify/.gitignore b/testcases/kernel/syscalls/fanotify/.gitignore
> > > index c26f2bd27..af420b8b3 100644
> > > --- a/testcases/kernel/syscalls/fanotify/.gitignore
> > > +++ b/testcases/kernel/syscalls/fanotify/.gitignore
> > > @@ -8,3 +8,4 @@
> > >  /fanotify08
> > >  /fanotify09
> > >  /fanotify10
> > > +/fanotify_child
> > > diff --git a/testcases/kernel/syscalls/fanotify/fanotify03.c b/testcases/kernel/syscalls/fanotify/fanotify03.c
> > > index cca15aa00..f9418ee6b 100644
> > > --- a/testcases/kernel/syscalls/fanotify/fanotify03.c
> > > +++ b/testcases/kernel/syscalls/fanotify/fanotify03.c
> > > @@ -35,6 +35,7 @@
> > >
> > >  #define BUF_SIZE 256
> > >  #define TST_TOTAL 3
> > > +#define TEST_APP "fanotify_child"
> > >
> > >  static char fname[BUF_SIZE];
> > >  static char buf[BUF_SIZE];
> > > @@ -60,28 +61,31 @@ static struct tcase {
> > >         {
> > >                 "inode mark permission events",
> > >                 INIT_FANOTIFY_MARK_TYPE(INODE),
> > > -               FAN_OPEN_PERM | FAN_ACCESS_PERM, 2,
> > > +               FAN_OPEN_PERM | FAN_ACCESS_PERM, 3,
> > >                 {
> > >                         {FAN_OPEN_PERM, FAN_ALLOW},
> > > -                       {FAN_ACCESS_PERM, FAN_DENY}
> > > +                       {FAN_ACCESS_PERM, FAN_DENY},
> > > +                       {FAN_OPEN_PERM, FAN_DENY}
> > >                 }
> > >         },
> > >         {
> > >                 "mount mark permission events",
> > >                 INIT_FANOTIFY_MARK_TYPE(MOUNT),
> > > -               FAN_OPEN_PERM | FAN_ACCESS_PERM, 2,
> > > +               FAN_OPEN_PERM | FAN_ACCESS_PERM, 3,
> > >                 {
> > >                         {FAN_OPEN_PERM, FAN_ALLOW},
> > > -                       {FAN_ACCESS_PERM, FAN_DENY}
> > > +                       {FAN_ACCESS_PERM, FAN_DENY},
> > > +                       {FAN_OPEN_PERM, FAN_DENY}
> > >                 }
> > >         },
> > >         {
> > >                 "filesystem mark permission events",
> > >                 INIT_FANOTIFY_MARK_TYPE(FILESYSTEM),
> > > -               FAN_OPEN_PERM | FAN_ACCESS_PERM, 2,
> > > +               FAN_OPEN_PERM | FAN_ACCESS_PERM, 3,
> > >                 {
> > >                         {FAN_OPEN_PERM, FAN_ALLOW},
> > > -                       {FAN_ACCESS_PERM, FAN_DENY}
> > > +                       {FAN_ACCESS_PERM, FAN_DENY},
> > > +                       {FAN_OPEN_PERM, FAN_DENY}
> > >                 }
> > >         }
> > >  };
> > > @@ -89,9 +93,10 @@ static struct tcase {
> > >  static void generate_events(void)
> > >  {
> > >         int fd;
> > > +       char *const argv[] = {TEST_APP, NULL};
> > >
> > >         /*
> > > -        * generate sequence of events
> > > +        * Generate sequence of events
> > >          */
> > >         if ((fd = open(fname, O_RDWR | O_CREAT, 0700)) == -1)
> > >                 exit(1);
> > > @@ -104,6 +109,9 @@ static void generate_events(void)
> > >
> > >         if (close(fd) == -1)
> > >                 exit(4);
> > > +
> > > +       if (execve(TEST_APP, argv, environ) != -1)
> > > +               exit(5);
> > >  }
> > >
> >
> > I am a bit puzzled.
> > Did you test this point in the series?
> >
> Yes, I did test it at this point.
>
> > If child is denied read access then it exits before execve(), so you
> > shouldn't be adding an extra OPEN event in event_set of exiting
> > test cases, which DENY ACCESS??
> >
> I don't know whether I'm understanding you correctly, but I do believe
> that it's needed based on the following facts. Within generate_events()
> the system logic flow is as follows:
>
> open(...)       == -1
> write(...)      == -1
> read(...)       != -1
> close(...)      == -1
> execve(...)     == -1
>
> Based on the sequence of system calls and comparison operators above, then
> if read access is denied (FAN_DENY) then it does not exit, as that is what
> is expected, so it falls through to the next set system calls. Based on
> that fact, an additional event {FAN_OPEN_PERM, FAN_DENY} is needed as this
> is the first event that is generated when the mask FAN_OPEN_EXEC_PERM
> hasn't been provided as a mask.
>

Right. I missed the fact that read failure is expected in generate_events
You really managed to extend the test coverage with minimal changes
to the test ;-)

Thanks,
Amir.


More information about the ltp mailing list