public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: Petr Vorel <pvorel@suse.cz>
To: Andrea Cervesato <andrea.cervesato@suse.com>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v3] getcpu: Add testcase for EFAULT
Date: Mon, 5 Aug 2024 18:43:48 +0200	[thread overview]
Message-ID: <20240805164348.GA53089@pevik> (raw)
In-Reply-To: <2d414c20-ab82-41d5-8490-335dd0134755@suse.com>

> Hi!

> On 8/5/24 11:22, Ma Xinjian via ltp wrote:
> > Add a testcase with the arguments point to an invalid address.

> > Reviewed-by: Petr Vorel <pvorel@suse.cz>
> > Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
> > Signed-off-by: Ma Xinjian <maxj.fnst@fujitsu.com>
> > ---
> >   runtest/syscalls                            |  1 +
> >   testcases/kernel/syscalls/getcpu/getcpu02.c | 97 +++++++++++++++++++++
> >   2 files changed, 98 insertions(+)
> >   create mode 100644 testcases/kernel/syscalls/getcpu/getcpu02.c

> > diff --git a/runtest/syscalls b/runtest/syscalls
> > index b8728c1c5..1537b5022 100644
> > --- a/runtest/syscalls
> > +++ b/runtest/syscalls
> > @@ -448,6 +448,7 @@ futimesat01 futimesat01
> >   getcontext01 getcontext01
> >   getcpu01 getcpu01
> > +getcpu02 getcpu02
> >   getcwd01 getcwd01
> >   getcwd02 getcwd02
> > diff --git a/testcases/kernel/syscalls/getcpu/getcpu02.c b/testcases/kernel/syscalls/getcpu/getcpu02.c
> > new file mode 100644
> > index 000000000..f32660ef9
> > --- /dev/null
> > +++ b/testcases/kernel/syscalls/getcpu/getcpu02.c
> > @@ -0,0 +1,97 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +/*
> > + * Copyright (c) 2024 FUJITSU LIMITED. All Rights Reserved.
> > + * Copyright (c) Linux Test Project, 2024
> > + * Author: Ma Xinjian <maxj.fnst@fujitsu.com>
> > + *
> > + */
> > +
> > +/*\
> > + * [Description]
> > + *
> > + * Verify that getcpu(2) fails with
> > + *
> > + * - EFAULT arguments point outside the calling process's address
> > + *          space.
> We can squeeze the description in one single line since EFAULT is the only
> one we are gonna test.

Good point. As Andrea suggested to use .tcnt, defining 2 testcases with
different getcpu() input values, these two would deserve to be described.

Also it'd be nice to add some tst_res(TINFO, ...) description in the testing
function (similar to one above in /*\.

Kind regards,
Petr

> > + */
> > +
> > +#define _GNU_SOURCE
> > +#include <errno.h>
> > +#include <sys/resource.h>
> > +#include <sys/time.h>
> > +#include <sys/wait.h>
> > +#include <stdlib.h>
> tst_test.h is importing these already.
> > +
> > +#include "tst_test.h"
> > +#include "lapi/sched.h"
> > +
> > +static void *bad_addr;
> > +
> > +static void setup(void)
> > +{
> > +	bad_addr = tst_get_bad_addr(NULL);
> > +}
> > +
> > +static void check_bad_cpu_id(void *bad_addr, unsigned int *node_id)
> > +{
> > +	int status;
> > +	pid_t pid;
> > +
> > +	pid = SAFE_FORK();
> > +	if (!pid) {
> > +		TST_EXP_FAIL(getcpu(bad_addr, node_id), EFAULT);
> > +
> > +		exit(0);
> > +	}
> > +
> > +	SAFE_WAITPID(pid, &status, 0);
> > +
> > +	if (WIFSIGNALED(status) && WTERMSIG(status) == SIGSEGV) {
> > +		tst_res(TPASS, "getcpu() caused SIGSEGV");
> > +		return;
> > +	}
> > +
> > +	if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
> > +		return;
> > +
> > +	tst_res(TFAIL, "child %s", tst_strstatus(status));
> > +}
> > +
> > +static void check_bad_node_id(unsigned int *cpu_id, void *bad_addr)
> > +{
> > +	int status;
> > +	pid_t pid;
> > +
> > +	pid = SAFE_FORK();
> > +	if (!pid) {
> > +		TST_EXP_FAIL(getcpu(cpu_id, bad_addr), EFAULT);
> > +
> > +		exit(0);
> > +	}
> > +
> > +	SAFE_WAITPID(pid, &status, 0);
> > +
> > +	if (WIFSIGNALED(status) && WTERMSIG(status) == SIGSEGV) {
> > +		tst_res(TPASS, "getcpu() caused SIGSEGV");
> > +		return;
> > +	}
> > +
> > +	if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
> > +		return;
> > +
> > +	tst_res(TFAIL, "child %s", tst_strstatus(status));
> > +}

These two testing functions are nearly the same, only parameters are different.
How about creating a single function and just pass a different params?
Also, only bad_addr and one of the functions holding "0" as id is needed.
> > +
> > +static void run_test(void)
> > +{
> > +	unsigned int cpu_id, node_id = 0;
> > +
> > +	check_bad_cpu_id(bad_addr, &node_id);
> > +	check_bad_node_id(&cpu_id, bad_addr);

> Here we can use .test/.tcnt , defining 2 testcases with different getcpu()
> input values.
+1

NOTE: sometimes we create struct tcase, but it'd be overkill for these 2
functions.

Kind regards,
Petr

> > +}
> > +
> > +static struct tst_test test = {
> > +	.setup = setup,
> > +	.test_all = run_test,
> > +	.forks_child = 1,
> > +};

> Best regards,
> Andrea Cervesato

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

      reply	other threads:[~2024-08-05 16:44 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-05  9:22 [LTP] [PATCH v3] getcpu: Add testcase for EFAULT Ma Xinjian via ltp
2024-08-05  9:52 ` Andrea Cervesato via ltp
2024-08-05 16:43   ` Petr Vorel [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240805164348.GA53089@pevik \
    --to=pvorel@suse.cz \
    --cc=andrea.cervesato@suse.com \
    --cc=ltp@lists.linux.it \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox