[LTP] [PATCH] setresuid04.c: Rewrite the test using new LTP API

Avinesh Kumar akumar@suse.de
Tue Dec 6 08:57:47 CET 2022


Signed-off-by: Avinesh Kumar <akumar@suse.de>
---
 .../kernel/syscalls/setresuid/setresuid04.c   | 255 ++++--------------
 1 file changed, 52 insertions(+), 203 deletions(-)

diff --git a/testcases/kernel/syscalls/setresuid/setresuid04.c b/testcases/kernel/syscalls/setresuid/setresuid04.c
index e197476ff..20840e2a2 100644
--- a/testcases/kernel/syscalls/setresuid/setresuid04.c
+++ b/testcases/kernel/syscalls/setresuid/setresuid04.c
@@ -1,223 +1,72 @@
-/******************************************************************************/
-/* Copyright (c) Kerlabs 2008.                                                */
-/* Copyright (c) International Business Machines  Corp., 2008                 */
-/*                                                                            */
-/* 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    */
-/*                                                                            */
-/******************************************************************************/
-/*
- * NAME
- * 	setresuid04.c
- *
- * DESCRIPTION
- * 	Check if setresuid behaves correctly with file permissions.
- *      The test creates a file as ROOT with permissions 0644, does a setresuid
- *      and then tries to open the file with RDWR permissions.
- *      The same test is done in a fork to check if new UIDs are correctly
- *      passed to the son.
- *
- * USAGE:  <for command-line>
- *  setresuid04 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
- *     where,  -c n : Run n copies concurrently.
- *             -e   : Turn on errno logging.
- *             -i n : Execute test n times.
- *             -I x : Execute test for x seconds.
- *             -P x : Pause for x seconds between iterations.
- *             -t   : Turn on syscall timing.
- *
- * HISTORY
- *	07/2001 Created by Renaud Lottiaux
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* Copyright (c) Kerlabs 2008.
+ * Copyright (c) International Business Machines  Corp., 2008
+ * Copyright (c) 2022 SUSE LLC Avinesh Kumar <avinesh.kumar@suse.com>
+ */
+
+/*\
+ * [Description]
  *
- * RESTRICTIONS
- * 	Must be run as root.
+ * Verify that setresuid() behaves correctly with file permissions.
+ * The test creates a file as ROOT with permissions 0644, does a setresuid
+ * to change euid to a non-root user and tries to open the file with RDWR
+ * permissions, which should fail with EACCES errno.
+ * The same test is done in a fork also to check that child process also
+ * inherits new euid and open fails with EACCES.
+ * Test verifies the successful open action after reverting the euid back
+ * ROOT user.
  */
-#define _GNU_SOURCE 1
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+
 #include <sys/wait.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include "test.h"
-#include "safe_macros.h"
 #include <pwd.h>
-#include "compat_16.h"
+#include "tst_test.h"
+#include "compat_tst_16.h"
 
-TCID_DEFINE(setresuid04);
-int TST_TOTAL = 1;
-char nobody_uid[] = "nobody";
-char testfile[256] = "";
-struct passwd *ltpuser;
+#define TEMP_FILE	"testfile"
+static char nobody_uid[] = "nobody";
+static struct passwd *ltpuser;
+static int fd = -1;
 
-int fd = -1;
-
-void setup(void);
-void cleanup(void);
-void do_master_child();
-
-int main(int ac, char **av)
+static void setup(void)
 {
-	pid_t pid;
-
-	tst_parse_opts(ac, av, NULL, NULL);
-	setup();
-
-	pid = FORK_OR_VFORK();
-	if (pid < 0)
-		tst_brkm(TBROK, cleanup, "Fork failed");
+	ltpuser = SAFE_GETPWNAM(nobody_uid);
+	UID16_CHECK(ltpuser->pw_uid, "setresuid");
 
-	if (pid == 0)
-		do_master_child();
-
-	tst_record_childstatus(cleanup, pid);
-
-	cleanup();
-	tst_exit();
+	fd = SAFE_OPEN(TEMP_FILE, O_CREAT | O_RDWR, 0644);
 }
 
-/*
- * do_master_child()
- */
-void do_master_child(void)
+static void run(void)
 {
-	int lc;
-	int pid;
+	pid_t pid;
 	int status;
 
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-		int tst_fd;
-
-		/* Reset tst_count in case we are looping */
-		tst_count = 0;
-
-		if (SETRESUID(NULL, 0, ltpuser->pw_uid, 0) == -1) {
-			perror("setresuid failed");
-			exit(TFAIL);
-		}
-
-		/* Test 1: Check the process with new uid cannot open the file
-		 *         with RDWR permissions.
-		 */
-		TEST(tst_fd = open(testfile, O_RDWR));
-
-		if (TEST_RETURN != -1) {
-			printf("open succeeded unexpectedly\n");
-			close(tst_fd);
-			exit(TFAIL);
-		}
-
-		if (TEST_ERRNO == EACCES) {
-			printf("open failed with EACCES as expected\n");
-		} else {
-			perror("open failed unexpectedly");
-			exit(TFAIL);
-		}
-
-		/* Test 2: Check a son process cannot open the file
-		 *         with RDWR permissions.
-		 */
-		pid = FORK_OR_VFORK();
-		if (pid < 0)
-			tst_brkm(TBROK, NULL, "Fork failed");
-
-		if (pid == 0) {
-			int tst_fd2;
+	SAFE_SETRESUID(0, ltpuser->pw_uid, 0);
+	TST_EXP_FAIL2(open(TEMP_FILE, O_RDWR), EACCES);
 
-			/* Test to open the file in son process */
-			TEST(tst_fd2 = open(testfile, O_RDWR));
-
-			if (TEST_RETURN != -1) {
-				printf("call succeeded unexpectedly\n");
-				close(tst_fd2);
-				exit(TFAIL);
-			}
-
-			if (TEST_ERRNO == EACCES) {
-				printf("open failed with EACCES as expected\n");
-				exit(TPASS);
-			} else {
-				printf("open failed unexpectedly\n");
-				exit(TFAIL);
-			}
-		} else {
-			/* Wait for son completion */
-			if (waitpid(pid, &status, 0) == -1) {
-				perror("waitpid failed");
-				exit(TFAIL);
-			}
-
-			if (!WIFEXITED(status))
-				exit(TFAIL);
-
-			if (WEXITSTATUS(status) != TPASS)
-				exit(WEXITSTATUS(status));
-		}
-
-		/* Test 3: Fallback to initial uid and check we can again open
-		 *         the file with RDWR permissions.
-		 */
-		tst_count++;
-		if (SETRESUID(NULL, 0, 0, 0) == -1) {
-			perror("setresuid failed");
-			exit(TFAIL);
-		}
-
-		TEST(tst_fd = open(testfile, O_RDWR));
-
-		if (TEST_RETURN == -1) {
-			perror("open failed unexpectedly");
-			exit(TFAIL);
-		} else {
-			printf("open call succeeded\n");
-			close(tst_fd);
-		}
+	pid = SAFE_FORK();
+	if (!pid) {
+		TST_EXP_FAIL2(open(TEMP_FILE, O_RDWR), EACCES);
+		return;
 	}
-	exit(TPASS);
-}
-
-/*
- * setup() - performs all ONE TIME setup for this test
- */
-void setup(void)
-{
-	tst_require_root();
+	SAFE_WAITPID(pid, &status, 0);
+	if (WIFEXITED(status) && WEXITSTATUS(status) != 0)
+		tst_res(TFAIL, "child process exited with status: %d", status);
 
-	ltpuser = getpwnam(nobody_uid);
-
-	UID16_CHECK(ltpuser->pw_uid, "setresuid", cleanup)
-
-	tst_tmpdir();
-
-	sprintf(testfile, "setresuid04file%d.tst", getpid());
-
-	/* Create test file */
-	fd = SAFE_OPEN(cleanup, testfile, O_CREAT | O_RDWR, 0644);
-
-	tst_sig(FORK, DEF_HANDLER, cleanup);
-
-	TEST_PAUSE;
+	SAFE_SETRESUID(0, 0, 0);
+	TST_EXP_FD(open(TEMP_FILE, O_RDWR));
+	SAFE_CLOSE(TST_RET);
 }
 
-/*
- * cleanup() - performs all the ONE TIME cleanup for this test at completion
- * 	       or premature exit
- */
-void cleanup(void)
+static void cleanup(void)
 {
-	close(fd);
-
-	tst_rmdir();
-
+	if (fd > 0)
+		SAFE_CLOSE(fd);
 }
+
+static struct tst_test test = {
+	.setup = setup,
+	.test_all = run,
+	.cleanup = cleanup,
+	.needs_root = 1,
+	.forks_child = 1
+};
-- 
2.38.1



More information about the ltp mailing list