[LTP] [PATCH 7/7] syscalls: mremap05: Convert to new API

Ricardo B. Marlière rbm@suse.com
Tue Jul 8 22:12:01 CEST 2025


From: Ricardo B. Marlière <rbm@suse.com>

Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
 testcases/kernel/syscalls/mremap/mremap05.c | 270 ++++++++++++----------------
 1 file changed, 119 insertions(+), 151 deletions(-)

diff --git a/testcases/kernel/syscalls/mremap/mremap05.c b/testcases/kernel/syscalls/mremap/mremap05.c
index d85ebb068dc42f3fa3856bba8614aeea0caf90ab..832bc305bb4f7dc3164186241ce0bd0ae202826a 100644
--- a/testcases/kernel/syscalls/mremap/mremap05.c
+++ b/testcases/kernel/syscalls/mremap/mremap05.c
@@ -1,190 +1,150 @@
+// SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright (C) 2012 Linux Test Project, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it
- * is free of the rightful claim of any third person regarding
- * infringement or the like.  Any license provided herein, whether
- * implied or otherwise, applies only to this software file.  Patent
- * licenses, if any, provided herein do not apply to combinations of
- * this program with other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
+ * Copyright (c) 2025 SUSE LLC Ricardo B. Marlière <rbm@suse.com>
  */
-/*
- * Test Name: mremap05
+
+/*\
+ * Verify that mremap():
  *
- * Test Description:
- *  Verify that MREMAP_FIXED fails without MREMAP_MAYMOVE.
- *  Verify that MREMAP_FIXED|MREMAP_MAYMOVE fails if target address
- *    is not page aligned.
- *  Verify that MREMAP_FIXED|MREMAP_MAYMOVE fails if old range
- *    overlaps with new range.
- *  Verify that MREMAP_FIXED|MREMAP_MAYMOVE can move mapping to new address.
- *  Verify that MREMAP_FIXED|MREMAP_MAYMOVE unmaps previous mapping
- *    at the address range specified by new_address and new_size.
+ * - Fails with EINVAL, when using MREMAP_FIXED flag without MREMAP_MAYMOVE
+ * - Fails with EINVAL, when using MREMAP_FIXED|MREMAP_MAYMOVE flags with
+ *   target address not page aligned.
+ * - Fails with EINVAL, when using MREMAP_FIXED|MREMAP_MAYMOVE flags with old
+ *   range overlapping the new range.
+ * - Succeeds, when moving a mapping to new address using
+ *   MREMAP_FIXED|MREMAP_MAYMOVE flags.
+ * - Succeeds, when unmapping previous mapping at the address range specified
+ *   by new_address and new_size using MREMAP_FIXED|MREMAP_MAYMOVE flags.
  */
 
 #define _GNU_SOURCE
-#include "config.h"
-#include <sys/mman.h>
-#include <errno.h>
-#include <unistd.h>
-#include "test.h"
-#include "safe_macros.h"
 
-char *TCID = "mremap05";
+#include "tst_test.h"
+
+static void setup(void);
+static void setup0(unsigned int i);
+static void setup1(unsigned int i);
+static void setup2(unsigned int i);
+static void setup3(unsigned int i);
+static void setup4(unsigned int i);
+static void cleanup0(unsigned int i);
+static void cleanup1(unsigned int i);
 
-struct test_case_t {
+static int pagesize;
+static struct test_case_t {
 	char *old_address;
 	char *new_address;
-	size_t old_size;	/* in pages */
-	size_t new_size;	/* in pages */
+	size_t old_size; /* in pages */
+	size_t new_size; /* in pages */
 	int flags;
 	const char *msg;
 	void *exp_ret;
 	int exp_errno;
 	char *ret;
-	void (*setup) (struct test_case_t *);
-	void (*cleanup) (struct test_case_t *);
-};
-
-static void setup(void);
-static void cleanup(void);
-static void setup0(struct test_case_t *);
-static void setup1(struct test_case_t *);
-static void setup2(struct test_case_t *);
-static void setup3(struct test_case_t *);
-static void setup4(struct test_case_t *);
-static void cleanup0(struct test_case_t *);
-static void cleanup1(struct test_case_t *);
-
-struct test_case_t tdat[] = {
+	void (*setup)(unsigned int i);
+	void (*cleanup)(unsigned int i);
+} tcases[] = {
 	{
-	 .old_size = 1,
-	 .new_size = 1,
-	 .flags = MREMAP_FIXED,
-	 .msg = "MREMAP_FIXED requires MREMAP_MAYMOVE",
-	 .exp_ret = MAP_FAILED,
-	 .exp_errno = EINVAL,
-	 .setup = setup0,
-	 .cleanup = cleanup0},
+		.old_size = 1,
+		.new_size = 1,
+		.flags = MREMAP_FIXED,
+		.msg = "MREMAP_FIXED requires MREMAP_MAYMOVE",
+		.exp_ret = MAP_FAILED,
+		.exp_errno = EINVAL,
+		.setup = setup0,
+		.cleanup = cleanup0,
+	},
 	{
-	 .old_size = 1,
-	 .new_size = 1,
-	 .flags = MREMAP_FIXED | MREMAP_MAYMOVE,
-	 .msg = "new_addr has to be page aligned",
-	 .exp_ret = MAP_FAILED,
-	 .exp_errno = EINVAL,
-	 .setup = setup1,
-	 .cleanup = cleanup0},
+		.old_size = 1,
+		.new_size = 1,
+		.flags = MREMAP_FIXED | MREMAP_MAYMOVE,
+		.msg = "new_addr has to be page aligned",
+		.exp_ret = MAP_FAILED,
+		.exp_errno = EINVAL,
+		.setup = setup1,
+		.cleanup = cleanup0,
+	},
 	{
-	 .old_size = 2,
-	 .new_size = 1,
-	 .flags = MREMAP_FIXED | MREMAP_MAYMOVE,
-	 .msg = "old/new area must not overlap",
-	 .exp_ret = MAP_FAILED,
-	 .exp_errno = EINVAL,
-	 .setup = setup2,
-	 .cleanup = cleanup0},
+		.old_size = 2,
+		.new_size = 1,
+		.flags = MREMAP_FIXED | MREMAP_MAYMOVE,
+		.msg = "old/new area must not overlap",
+		.exp_ret = MAP_FAILED,
+		.exp_errno = EINVAL,
+		.setup = setup2,
+		.cleanup = cleanup0,
+	},
 	{
-	 .old_size = 1,
-	 .new_size = 1,
-	 .flags = MREMAP_FIXED | MREMAP_MAYMOVE,
-	 .msg = "mremap #1",
-	 .setup = setup3,
-	 .cleanup = cleanup0},
+		.old_size = 1,
+		.new_size = 1,
+		.flags = MREMAP_FIXED | MREMAP_MAYMOVE,
+		.msg = "mremap #1",
+		.setup = setup3,
+		.cleanup = cleanup0,
+	},
 	{
-	 .old_size = 1,
-	 .new_size = 1,
-	 .flags = MREMAP_FIXED | MREMAP_MAYMOVE,
-	 .msg = "mremap #2",
-	 .setup = setup4,
-	 .cleanup = cleanup1},
+		.old_size = 1,
+		.new_size = 1,
+		.flags = MREMAP_FIXED | MREMAP_MAYMOVE,
+		.msg = "mremap #2",
+		.setup = setup4,
+		.cleanup = cleanup1,
+	},
 };
 
-static int pagesize;
-static int TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]);
-
 static void free_test_area(void *p, int size)
 {
-	SAFE_MUNMAP(cleanup, p, size);
+	SAFE_MUNMAP(p, size);
 }
 
 static void *get_test_area(int size, int free_area)
 {
-	void *p;
-	p = mmap(NULL, size, PROT_READ | PROT_WRITE,
-		 MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
-	if (p == MAP_FAILED)
-		tst_brkm(TBROK | TERRNO, cleanup, "get_test_area mmap");
+	void *p = SAFE_MMAP(NULL, size, PROT_READ | PROT_WRITE,
+			    MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
 	if (free_area)
 		free_test_area(p, size);
 	return p;
 }
 
-static void test_mremap(struct test_case_t *t)
+static void setup0(unsigned int i)
 {
-	t->ret = mremap(t->old_address, t->old_size, t->new_size, t->flags,
-			t->new_address);
-
-	if (t->ret == t->exp_ret) {
-		if (t->ret != MAP_FAILED) {
-			tst_resm(TPASS, "%s", t->msg);
-			if (*(t->ret) == 0x1)
-				tst_resm(TPASS, "%s value OK", t->msg);
-			else
-				tst_resm(TPASS, "%s value failed", t->msg);
-		} else {
-			if (errno == t->exp_errno)
-				tst_resm(TPASS, "%s", t->msg);
-			else
-				tst_resm(TFAIL | TERRNO, "%s", t->msg);
-		}
-	} else {
-		tst_resm(TFAIL, "%s ret: %p, expected: %p", t->msg,
-			 t->ret, t->exp_ret);
-	}
-}
+	struct test_case_t *t = &tcases[i];
 
-static void setup0(struct test_case_t *t)
-{
 	t->old_address = get_test_area(t->old_size * pagesize, 0);
 	t->new_address = get_test_area(t->new_size * pagesize, 1);
 }
 
-static void setup1(struct test_case_t *t)
+static void setup1(unsigned int i)
 {
+	struct test_case_t *t = &tcases[i];
+
 	t->old_address = get_test_area(t->old_size * pagesize, 0);
 	t->new_address = get_test_area((t->new_size + 1) * pagesize, 1) + 1;
 }
 
-static void setup2(struct test_case_t *t)
+static void setup2(unsigned int i)
 {
+	struct test_case_t *t = &tcases[i];
+
 	t->old_address = get_test_area(t->old_size * pagesize, 0);
 	t->new_address = t->old_address;
 }
 
-static void setup3(struct test_case_t *t)
+static void setup3(unsigned int i)
 {
+	struct test_case_t *t = &tcases[i];
+
 	t->old_address = get_test_area(t->old_size * pagesize, 0);
 	t->new_address = get_test_area(t->new_size * pagesize, 1);
 	t->exp_ret = t->new_address;
 	*(t->old_address) = 0x1;
 }
 
-static void setup4(struct test_case_t *t)
+static void setup4(unsigned int i)
 {
+	struct test_case_t *t = &tcases[i];
+
 	t->old_address = get_test_area(t->old_size * pagesize, 0);
 	t->new_address = get_test_area(t->new_size * pagesize, 0);
 	t->exp_ret = t->new_address;
@@ -192,16 +152,20 @@ static void setup4(struct test_case_t *t)
 	*(t->new_address) = 0x2;
 }
 
-static void cleanup0(struct test_case_t *t)
+static void cleanup0(unsigned int i)
 {
+	struct test_case_t *t = &tcases[i];
+
 	if (t->ret == MAP_FAILED)
 		free_test_area(t->old_address, t->old_size * pagesize);
 	else
 		free_test_area(t->ret, t->new_size * pagesize);
 }
 
-static void cleanup1(struct test_case_t *t)
+static void cleanup1(unsigned int i)
 {
+	struct test_case_t *t = &tcases[i];
+
 	if (t->ret == MAP_FAILED) {
 		free_test_area(t->old_address, t->old_size * pagesize);
 		free_test_area(t->new_address, t->new_size * pagesize);
@@ -210,30 +174,34 @@ static void cleanup1(struct test_case_t *t)
 	}
 }
 
-int main(int ac, char **av)
+static void run(unsigned int i)
 {
-	int lc, testno;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-		tst_count = 0;
-		for (testno = 0; testno < TST_TOTAL; testno++) {
-			tdat[testno].setup(&tdat[testno]);
-			test_mremap(&tdat[testno]);
-			tdat[testno].cleanup(&tdat[testno]);
-		}
-	}
-	cleanup();
-	tst_exit();
+	struct test_case_t *t = &tcases[i];
+
+	if (t->setup)
+		t->setup(i);
+
+	if (t->exp_errno)
+		TST_EXP_FAIL_PTR_VOID(mremap(t->old_address, t->old_size,
+					     t->new_size, t->flags,
+					     t->new_address),
+				      t->exp_errno, "%s", t->msg);
+	else
+		TST_EXP_PASS_PTR_VOID(mremap(t->old_address, t->old_size,
+					     t->new_size, t->flags,
+					     t->new_address));
+
+	if (t->cleanup)
+		t->cleanup(i);
 }
 
 static void setup(void)
 {
-	pagesize = getpagesize();
+	pagesize = SAFE_SYSCONF(_SC_PAGESIZE);
 }
 
-static void cleanup(void)
-{
-}
+static struct tst_test test = {
+	.test = run,
+	.tcnt = ARRAY_SIZE(tcases),
+	.setup = setup,
+};

-- 
2.50.0



More information about the ltp mailing list