[igt-dev] [i-g-t,v2] igt/gem_mmap_offset: Adding subtest oob_read

Mastan Katragadda mastanx.katragadda at intel.com
Fri Mar 11 07:03:09 UTC 2022


This test will Detect A missing bounds check in vm_access().
can lead to an out-of-bounds read or write in the adjacent memory area.

Changes Since V1:
	- Incorporated minor changes as suggested in feedback [Chris/Matthew].
        - Fixed build failures.

Signed-off-by: Mastan Katragadda <mastanx.katragadda at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Cc: Matthew Auld <matthew.auld at intel.com>
---
 tests/i915/gem_mmap_offset.c | 44 ++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
index 8148f0a2..c8fab18b 100644
--- a/tests/i915/gem_mmap_offset.c
+++ b/tests/i915/gem_mmap_offset.c
@@ -22,6 +22,8 @@
  */
 
 #include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
 #include <pthread.h>
 #include <signal.h>
 #include <stdatomic.h>
@@ -289,6 +291,44 @@ static void *memchr_inv(const void *s, int c, size_t n)
 	return NULL;
 }
 
+static void
+test_oob_read(int i915)
+{
+	unsigned char read_buf[4096];
+	uint32_t handle;
+	uintptr_t addr;
+	int memfd;
+	int ret;
+
+	handle = gem_create(i915, 4096);
+
+	for_each_mmap_offset_type(i915, t) {
+		uint32_t *ptr;
+
+		ptr = __mmap_offset(i915, handle, 0, 4096,
+				    PROT_READ | PROT_WRITE,
+				    t->type);
+		if (!ptr)
+			continue;
+
+		memfd = open("/proc/self/mem", O_RDWR);
+		igt_require_f(memfd != -1, "/proc/self/mem\n");
+
+		addr = (uintptr_t)ptr + 4092;
+		ret = lseek(memfd, addr, SEEK_SET);
+		igt_assert_f(ret != -1, "lseek failed\n");
+
+		/* Triggering the buf (out of bound read) */
+		ret = read(memfd, read_buf, 8);
+		igt_assert(ret == -1 && errno ==  EIO);
+
+		munmap(ptr, 4096);
+		close(memfd);
+	}
+
+	gem_close(i915, handle);
+}
+
 static void test_ptrace(int i915)
 {
 	const unsigned int SZ = 3 * 4096;
@@ -692,6 +732,10 @@ igt_main
 	igt_subtest_f("pf-nonblock")
 		pf_nonblock(i915);
 
+	igt_describe("Check Linear Out-Of-Bound in Vm_access");
+	igt_subtest("oob-read")
+		test_oob_read(i915);
+
 	igt_subtest_with_dynamic("ptrace")
 		test_ptrace(i915);
 
-- 
2.25.1



More information about the igt-dev mailing list