Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Manszewski <christoph.manszewski@intel.com>
To: igt-dev@lists.freedesktop.org
Cc: "Zbigniew Kempczyński" <zbigniew.kempczynski@intel.com>,
	"Kamil Konieczny" <kamil.konieczny@linux.intel.com>,
	"Dominik Grzegorzek" <dominik.grzegorzek@intel.com>,
	"Maciej Patelczyk" <maciej.patelczyk@intel.com>,
	"Dominik Karol Piątkowski" <dominik.karol.piatkowski@intel.com>,
	"Pawel Sikora" <pawel.sikora@intel.com>,
	"Andrzej Hajda" <andrzej.hajda@intel.com>,
	"Kolanupaka Naveena" <kolanupaka.naveena@intel.com>,
	"Mika Kuoppala" <mika.kuoppala@intel.com>,
	"Gwan-gyeong Mun" <gwan-gyeong.mun@intel.com>
Subject: [PATCH i-g-t v2 29/66] tests/xe_eudebug: Added connect-user test
Date: Tue, 30 Jul 2024 13:44:46 +0200	[thread overview]
Message-ID: <20240730114523.334156-30-christoph.manszewski@intel.com> (raw)
In-Reply-To: <20240730114523.334156-1-christoph.manszewski@intel.com>

From: Maciej Patelczyk <maciej.patelczyk@intel.com>

Verify the connection:
 * user to user
 * user to root
 * root to user
 * user to other user

The test uses two known non-privileged users lp and mail to verify
the scenarios. Test drops root privileges to one of users if necessary.

ptrace cannot access process which is not dumpable.  The default value
of this property is stored in '/proc/sys/fs/suid_dumpable'. If process
drops privileges then it gets the value from mentioned suid_dumpable.

In our case the value after switching userm, to non privileged one,
is 2 (SUID_DUMP_ROOT). Enforce it to be 1 (SUID_DUMP_USER).

Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Cc: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
---
 tests/intel/xe_eudebug.c | 164 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 164 insertions(+)

diff --git a/tests/intel/xe_eudebug.c b/tests/intel/xe_eudebug.c
index 022b39f1f..8c21cffc7 100644
--- a/tests/intel/xe_eudebug.c
+++ b/tests/intel/xe_eudebug.c
@@ -12,9 +12,12 @@
  * Test category: functionality test
  */
 
+#include <grp.h>
 #include <poll.h>
 #include <pthread.h>
+#include <pwd.h>
 #include <sys/ioctl.h>
+#include <sys/prctl.h>
 
 #include "igt.h"
 #include "intel_pat.h"
@@ -545,6 +548,164 @@ static void test_connect(int fd)
 	close(debugfd);
 }
 
+static void switch_user(__uid_t uid, __gid_t gid)
+{
+	struct group *gr;
+	__gid_t gr_v;
+
+	/* Users other then root need to belong to video group */
+	gr = getgrnam("video");
+	igt_assert(gr);
+
+	/* Drop all */
+	igt_assert_eq(setgroups(1, &gr->gr_gid), 0);
+	igt_assert_eq(setgid(gid), 0);
+	igt_assert_eq(setuid(uid), 0);
+
+	igt_assert_eq(getgroups(1, &gr_v), 1);
+	igt_assert_eq(gr_v, gr->gr_gid);
+	igt_assert_eq(getgid(), gid);
+	igt_assert_eq(getuid(), uid);
+
+	igt_assert_eq(prctl(PR_SET_DUMPABLE, 1L), 0);
+}
+
+/**
+ * SUBTEST: connect-user
+ * Description:
+ *	Verify unprivileged XE_EUDEBG_CONNECT ioctl.
+ *	Check:
+ *	 - user debugger to user workload connection
+ *	 - user debugger to other user workload connection
+ *	 - user debugger to privileged workload connection
+ */
+static void test_connect_user(int fd)
+{
+	struct drm_xe_eudebug_connect param = {};
+	struct passwd *pwd, *pwd2;
+	const char *user1 = "lp";
+	const char *user2 = "mail";
+	int debugfd, ret, i;
+	int p1[2], p2[2];
+	__uid_t u1, u2;
+	__gid_t g1, g2;
+	int newfd;
+	pid_t pid;
+
+#define NUM_USER_TESTS 4
+#define P_APP 0
+#define P_GDB 1
+	struct conn_user {
+		/* u[0] - process uid, u[1] - gdb uid */
+		__uid_t u[P_GDB + 1];
+		/* g[0] - process gid, g[1] - gdb gid */
+		__gid_t g[P_GDB + 1];
+		/* Expected fd from open */
+		int ret;
+		/* Skip this test case */
+		int skip;
+		const char *desc;
+	} test[NUM_USER_TESTS] = {};
+
+	igt_assert(!pipe(p1));
+	igt_assert(!pipe(p2));
+
+	pwd = getpwnam(user1);
+	igt_require(pwd);
+	u1 = pwd->pw_uid;
+	g1 = pwd->pw_gid;
+
+	/*
+	 * Keep a copy of needed contents as it is a static
+	 * memory area and subsequent calls will overwrite
+	 * what's in.
+	 * However getpwnam() returns NULL if cannot find
+	 * user in passwd.
+	 */
+	setpwent();
+	pwd2 = getpwnam(user2);
+	if (pwd2) {
+		u2 = pwd2->pw_uid;
+		g2 = pwd2->pw_gid;
+	}
+
+	test[0].skip = !pwd;
+	test[0].u[P_GDB] = u1;
+	test[0].g[P_GDB] = g1;
+	test[0].ret = -EACCES;
+	test[0].desc = "User GDB to Root App";
+
+	test[1].skip = !pwd;
+	test[1].u[P_APP] = u1;
+	test[1].g[P_APP] = g1;
+	test[1].u[P_GDB] = u1;
+	test[1].g[P_GDB] = g1;
+	test[1].ret = 0;
+	test[1].desc = "User GDB to User App";
+
+	test[2].skip = !pwd;
+	test[2].u[P_APP] = u1;
+	test[2].g[P_APP] = g1;
+	test[2].ret = 0;
+	test[2].desc = "Root GDB to User App";
+
+	test[3].skip = !pwd2;
+	test[3].u[P_APP] = u1;
+	test[3].g[P_APP] = g1;
+	test[3].u[P_GDB] = u2;
+	test[3].g[P_GDB] = g2;
+	test[3].ret = -EACCES;
+	test[3].desc = "User GDB to Other User App";
+
+	if (!pwd2)
+		igt_warn("User %s not available in the system. Skipping subtests: %s.\n",
+			 user2, test[3].desc);
+
+	for (i = 0; i < NUM_USER_TESTS; i++) {
+		if (test[i].skip) {
+			igt_debug("Subtest %s skipped\n", test[i].desc);
+			continue;
+		}
+		igt_debug("Executing connection: %s\n", test[i].desc);
+		igt_fork(child, 2) {
+			if (!child) {
+				if (test[i].u[P_APP])
+					switch_user(test[i].u[P_APP], test[i].g[P_APP]);
+
+				pid = getpid();
+				/* Signal the PID */
+				igt_assert(write(p1[1], &pid, sizeof(pid)) == sizeof(pid));
+				/* wait with exit */
+				igt_assert(read(p2[0], &pid, sizeof(pid)) == sizeof(pid));
+			} else {
+				if (test[i].u[P_GDB])
+					switch_user(test[i].u[P_GDB], test[i].g[P_GDB]);
+
+				igt_assert(read(p1[0], &pid, sizeof(pid)) == sizeof(pid));
+				param.pid = pid;
+
+				newfd = drm_open_driver(DRIVER_XE);
+				ret = __debug_connect(newfd, &debugfd, &param);
+
+				/* Release the app first */
+				igt_assert(write(p2[1], &pid, sizeof(pid)) == sizeof(pid));
+
+				igt_assert_eq(ret, test[i].ret);
+				if (!ret)
+					close(debugfd);
+			}
+		}
+		igt_waitchildren();
+	}
+	close(p1[0]);
+	close(p1[1]);
+	close(p2[0]);
+	close(p2[1]);
+#undef NUM_USER_TESTS
+#undef P_APP
+#undef P_GDB
+}
+
 /**
  * SUBTEST: basic-close
  * Description:
@@ -1534,6 +1695,9 @@ igt_main
 	igt_subtest("basic-connect")
 		test_connect(fd);
 
+	igt_subtest("connect-user")
+		test_connect_user(fd);
+
 	igt_subtest("basic-close")
 		test_close(fd);
 
-- 
2.34.1


  parent reply	other threads:[~2024-07-30 11:48 UTC|newest]

Thread overview: 113+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-30 11:44 [PATCH i-g-t v2 00/66] Test coverage for GPU debug support Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 01/66] drm-uapi/xe: Sync with eudebug uapi Christoph Manszewski
2024-08-08 13:18   ` Kamil Konieczny
2024-08-08 15:05     ` Manszewski, Christoph
2024-07-30 11:44 ` [PATCH i-g-t v2 02/66] tests/xe_eudebug: Test eudebug connection Christoph Manszewski
2024-08-01  9:16   ` Grzegorzek, Dominik
2024-08-02 10:14     ` Manszewski, Christoph
2024-08-01  9:30   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 03/66] lib/xe_eudebug: Introduce eu debug testing framework Christoph Manszewski
2024-08-01 11:18   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 04/66] lib/xe_eudebug: Allow client to wait for debugger Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 05/66] lib/xe_eudebug: Add exec_queue support Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 06/66] lib/xe_eudebug: Add attention events support Christoph Manszewski
2024-08-01 11:20   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 07/66] lib/xe_ioctl: Add wrapper with vm_bind_op extension parameter Christoph Manszewski
2024-08-01 11:23   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 08/66] lib/xe_eudebug: Add support for vm_bind events Christoph Manszewski
2024-08-01 11:28   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 09/66] lib/xe_eudebug: Add metadata support Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 10/66] lib/xe_eudebug: Add support for user fence acking Christoph Manszewski
2024-08-01 11:34   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 11/66] lib/xe_eudebug: Add support for dynamic debugger sysfs toggle Christoph Manszewski
2024-08-01 11:51   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 12/66] tests/xe_eudebug: Test open close events Christoph Manszewski
2024-08-01 11:53   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 13/66] tests/xe_eudebug: Exercise read_event ioctl Christoph Manszewski
2024-08-01 12:01   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 14/66] tests/xe_eudebug: Add vm events sanity check Christoph Manszewski
2024-08-01 12:04   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 15/66] tests/xe_eudebug: Race discovery against eudebug attach Christoph Manszewski
2024-08-01 12:08   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 16/66] tests/xe_eudebug: Introduce basic exec_queue testing Christoph Manszewski
2024-08-01 12:15   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 17/66] tests/xe_eudebug: Include exec queues in discovery testing Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 18/66] tests/xe_eudebug: Add vm open/pread/pwrite basic tests Christoph Manszewski
2024-08-01 12:20   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 19/66] tests/xe_eudebug: Add basic vm-bind coverage Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 20/66] tests/xe_eudebug: Exercise debug metadata events sent to debugger Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 21/66] tests/xe_eudebug: Add support for dynamic debugger sysfs toggle Christoph Manszewski
2024-08-01 12:25   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 22/66] tests/xe_eudebug: Add coverage for sysfs debugger toggle Christoph Manszewski
2024-08-01 12:28   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 23/66] lib/xe_eudebug: Allow debugger to wait for client Christoph Manszewski
2024-08-01 12:31   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 24/66] tests/xe_eudebug: Add vm-bind discovery tests Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 25/66] tests/xe_eudebug: Add basic-vm-bind-metadata-discovery Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 26/66] tests/xe_eudebug: Add basic-vm-access-parameters test Christoph Manszewski
2024-08-01 12:42   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 27/66] lib/xe_eudebug: Add mutex for log events write Christoph Manszewski
2024-08-01 12:43   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 28/66] tests/xe_eudebug: Add basic-client-th test Christoph Manszewski
2024-08-01 12:49   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` Christoph Manszewski [this message]
2024-07-30 11:44 ` [PATCH i-g-t v2 30/66] tests/xe_eudebug: Add discovery-race-vmbind subtest Christoph Manszewski
2024-08-01  6:25   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 31/66] tests/xe_eudebug: Add userptr variant of basic-vm-access test Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 32/66] tests/xe_eudebug: Add basic-vm-bind-ufence Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 33/66] tests/xe_eudebug: Add multigpu scenarios Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 34/66] tests/xe_eudebug: Add vm-bind-clear test Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 35/66] tests/xe_eudebug: Exercise lseek Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 36/66] tests/xe_eudebug: Test multiple bo sizes Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 37/66] lib/gpgpu_shader: Extend shader building library Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 38/66] tests/xe_exec_sip: Port tests for shaders and sip Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 39/66] tests/xe_exec_sip: Check if we reset due to unhandled attention Christoph Manszewski
2024-08-01 12:57   ` Piatkowski, Dominik Karol
2024-08-01 19:04   ` Grzegorzek, Dominik
2024-07-30 11:44 ` [PATCH i-g-t v2 40/66] tests/xe_exec_sip: Check usercoredump for attentions Christoph Manszewski
2024-07-30 11:44 ` [PATCH i-g-t v2 41/66] tests/xe_exec_sip: Add support for dynamic debugger sysfs toggle Christoph Manszewski
2024-08-01 12:58   ` Piatkowski, Dominik Karol
2024-07-30 11:44 ` [PATCH i-g-t v2 42/66] tests/xe_exec_sip: Add breakpoint-writesip-twice test Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 43/66] tests/xe_exec_sip: Add sanity-after-timeout test Christoph Manszewski
2024-08-01  7:08   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 44/66] tests/xe_exec_sip: Add breakpoint-waitsip-heavy test Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 45/66] tests/xe_exec_sip: Add nodebug test cases Christoph Manszewski
2024-08-01  7:23   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 46/66] lib/gpgpu_shader: Add write_on_exception template Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 47/66] lib/gpgpu_shader: Add set/clear exception register (cr0.1) helpers Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 48/66] lib/intel_batchbuffer: Add helper to get pointer at specified offset Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 49/66] lib/gpgpu_shader: Allow enabling illegal opcode exceptions in shader Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 50/66] tests/xe_exec_sip: Rework invalid instruction tests Christoph Manszewski
2024-08-01 19:22   ` Grzegorzek, Dominik
2024-07-30 11:45 ` [PATCH i-g-t v2 51/66] lib/intel_batchbuffer: Add support for long-running mode execution Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 52/66] tests/xe_eudebug_online: Debug client which runs workloads on EU Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 53/66] tests/xe_eudebug_online: Set dynamic breakpoint on interrupt-all Christoph Manszewski
2024-08-05  6:27   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 54/66] tests/xe_eudebug_online: Add support for dynamic debugger sysfs toggle Christoph Manszewski
2024-08-05  6:30   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 55/66] tests/xe_eudebug_online: Add tdctl-parameters test Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 56/66] tests/xe_eudebug_online: Add reset-with-attention test Christoph Manszewski
2024-08-05  6:46   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 57/66] lib/xe_eudebug: Expose xe_eudebug_connect Christoph Manszewski
2024-08-05  6:48   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 58/66] tests/xe_eudebug_online: Add interrupt-reconnect test Christoph Manszewski
2024-08-05  7:53   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 59/66] tests/xe_eudebug_online: Add single-step and single-step-one tests Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 60/66] tests/xe_eudebug_online: What if user does not set debug mode? Christoph Manszewski
2024-08-05  7:55   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 61/66] tests/xe_eudebug_online: Adds debugger-reopen test Christoph Manszewski
2024-08-01  8:22   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 62/66] tests/xe_eudebug_online: Add caching tests Christoph Manszewski
2024-08-01 12:52   ` Piatkowski, Dominik Karol
2024-07-30 11:45 ` [PATCH i-g-t v2 63/66] tests/xe_eudebug_online: Add subtests w/o long running mode Christoph Manszewski
2024-08-01  9:09   ` Piatkowski, Dominik Karol
2024-08-01 19:27   ` Grzegorzek, Dominik
2024-07-30 11:45 ` [PATCH i-g-t v2 64/66] tests/xe_eudebug_online: Add multisession test cases Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 65/66] tests/xe_eudebug_online: Check if eu debugger disables preemption timeout Christoph Manszewski
2024-07-30 11:45 ` [PATCH i-g-t v2 66/66] tests/xe_live_ktest: Add xe_eudebug live test Christoph Manszewski
2024-07-30 16:15 ` ✗ GitLab.Pipeline: warning for Test coverage for GPU debug support (rev2) Patchwork
2024-07-30 16:23 ` ✓ CI.xeBAT: success " Patchwork
2024-07-30 16:36 ` ✗ Fi.CI.BAT: failure " Patchwork
2024-07-30 17:16 ` ✗ CI.xeFULL: " Patchwork
2024-08-08 11:13 ` [PATCH i-g-t v2 00/66] Test coverage for GPU debug support Zbigniew Kempczyński
2024-08-08 11:42   ` Manszewski, Christoph

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=20240730114523.334156-30-christoph.manszewski@intel.com \
    --to=christoph.manszewski@intel.com \
    --cc=andrzej.hajda@intel.com \
    --cc=dominik.grzegorzek@intel.com \
    --cc=dominik.karol.piatkowski@intel.com \
    --cc=gwan-gyeong.mun@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=kamil.konieczny@linux.intel.com \
    --cc=kolanupaka.naveena@intel.com \
    --cc=maciej.patelczyk@intel.com \
    --cc=mika.kuoppala@intel.com \
    --cc=pawel.sikora@intel.com \
    --cc=zbigniew.kempczynski@intel.com \
    /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