[LTP] [PATCH] mprotect: Add mprotect05 testcase

Liam R. Howlett Liam.Howlett@Oracle.com
Wed Mar 1 17:09:56 CET 2023


* Cyril Hrubis <chrubis@suse.cz> [230301 10:27]:
> Hi!
> > Add a test that uses mprotect to split and combine VMAs.  Created to
> > ensure the correctness of the VMA iterator after a bug report.
> > 
> > Link: https://bugzilla.kernel.org/show_bug.cgi?id=217061
> > Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
> > ---
> >  .../kernel/syscalls/mprotect/mprotect05.c     | 118 ++++++++++++++++++
> >  1 file changed, 118 insertions(+)
> >  create mode 100644 testcases/kernel/syscalls/mprotect/mprotect05.c
> > 
> > diff --git a/testcases/kernel/syscalls/mprotect/mprotect05.c b/testcases/kernel/syscalls/mprotect/mprotect05.c
> > new file mode 100644
> > index 000000000..36f137544
> > --- /dev/null
> > +++ b/testcases/kernel/syscalls/mprotect/mprotect05.c
> > @@ -0,0 +1,118 @@
> > +/*
> > + * Copyright (c) International Business Machines  Corp., 2001
> > + *
> > + * This program is free software;  you can redistribute it and/or modify
> > + * it under the terms of the GNU General Public License as published by
> > + * the Free Software Foundation; either version 2 of the License, or
> > + * (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY;  without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
> > + * the GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program;  if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> > + */
> 
> We switched to SPDX long time ago, please use that instead.

Thanks, this seems to be the wrong file anyways.  I've messed up this
patch.  I'll move to SPDX from the right file.

> 
> > +/*
> > + * DESCRIPTION
> > + *	Testcase to check the mprotect(2) system call split/merge
> > + *
> > + * ALGORITHM
> > + *	Create a mapped region using mmap with READ permission.
> > + *	Create different VMAs in stripes with mprotect (exec & write)
> > + *	mprotect over middle & write area, causing vma_merge of prev & next
> > + *	before hitting the limnits.
> > + *
> > + */
> 
> This should be asciidoc formatted comment that starts with a special
> header:
> 
> /*\
>  * [Description]
>  *

Thanks.

> 
> > +#include <sys/mman.h>
> > +#include <sys/wait.h>
> > +#include <errno.h>
> > +#include <fcntl.h>
> > +#include <limits.h>
> > +#include <stdlib.h>
> > +#include "test.h"
> > +
> > +#include "safe_macros.h"
> > +
> > +static void sighandler(int sig);
> > +static void cleanup(void);
> > +static void setup(void);
> > +
> > +char *TCID = "mprotect05";
> > +int TST_TOTAL = 1;
> > +static int fd;
> > +static char file1[BUFSIZ];
> > +
> > +static char *addr = MAP_FAILED;
> > +static unsigned long fullsize;
> > +
> > +int main(int ac, char **av)
> > +{
> > +	int lc;
> > +	int fd;
> > +	unsigned long pagesize;
> > +
> > +	tst_parse_opts(ac, av, NULL, NULL);
> > +
> > +	setup();
> > +
> > +	pagesize = getpagesize();
> > +	fullsize = 5 * pagesize;
> > +
> > +	for (lc = 0; TEST_LOOPING(lc); lc++) {
> > +		fd = SAFE_OPEN(cleanup, file1, O_RDWR | O_CREAT, 0777);
> > +
> > +		addr = SAFE_MMAP(cleanup, 0, fullsize, PROT_READ,
> > +				MAP_SHARED, fd, 0);
> > +
> > +		TEST(mprotect(addr + pagesize, pagesize*1, PROT_EXEC));
> > +		if (TEST_RETURN)
> > +			tst_resm(TFAIL | TERRNO, "mprotect failed to write");
> > +
> > +		TEST(mprotect(addr + 3*pagesize, pagesize, PROT_WRITE));
> > +		if (TEST_RETURN)
> > +			tst_resm(TFAIL | TERRNO, "mprotect failed to write");
> > +
> > +		TEST(mprotect(addr + pagesize, pagesize*4, PROT_READ));
> > +		if (TEST_RETURN)
> > +			tst_resm(TFAIL | TERRNO, "mprotect failed to write");
> > +
> > +		SAFE_MUNMAP(cleanup, addr, fullsize);
> > +		addr = MAP_FAILED;
> > +		SAFE_CLOSE(cleanup, fd);
> > +		SAFE_UNLINK(cleanup, file1);
> > +	}
> > +
> > +	cleanup();
> > +	tst_exit();
> > +}
> 
> Please use the new test library, the old test library is deprecated and
> will be removed. See include/tst_test.h.

Thanks.  I'll do that.

> 
> > +static void sighandler(int sig)
> > +{
> > +	_exit((sig == SIGSEGV) ? 0 : sig);
> > +}
> > +
> > +static void setup(void)
> > +{
> > +	tst_sig(FORK, sighandler, cleanup);
> > +
> > +	TEST_PAUSE;
> > +
> > +	tst_tmpdir();
> > +
> > +	sprintf(file1, "mprotect05.tmp.%d", getpid());
> > +}
> > +
> > +static void cleanup(void)
> > +{
> > +	if (addr != MAP_FAILED) {
> > +		SAFE_MUNMAP(NULL, addr, fullsize);
> > +		SAFE_CLOSE(NULL, fd);
> > +	}
> > +
> > +	tst_rmdir();
> > +}
> > -- 
> > 2.39.0
> > 
> > 
> > -- 
> > Mailing list info: https://lists.linux.it/listinfo/ltp
> 
> -- 
> Cyril Hrubis
> chrubis@suse.cz


More information about the ltp mailing list