[igt-dev] [PATCH i-g-t v3 08/12] i915/gem_mmap_offset: Verify all regions remain in isolation
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Fri Sep 2 13:00:03 UTC 2022
From: Chris Wilson <chris.p.wilson at intel.com>
Check that we don't leak mmap pointers to different regions.
Signed-off-by: Chris Wilson <chris.p.wilson at intel.com>
Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
---
tests/i915/gem_mmap_offset.c | 99 +++++++++++++++++++-----------------
1 file changed, 51 insertions(+), 48 deletions(-)
diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
index 608080c717..c9a3eb5b94 100644
--- a/tests/i915/gem_mmap_offset.c
+++ b/tests/i915/gem_mmap_offset.c
@@ -219,68 +219,71 @@ static void basic_uaf(int i915)
static void isolation(int i915)
{
- for_each_mmap_offset_type(i915, t) {
- struct drm_i915_gem_mmap_offset mmap_arg = {
- .flags = t->type
- };
- int A = gem_reopen_driver(i915);
- int B = gem_reopen_driver(i915);
- uint64_t offset_a, offset_b;
- uint32_t a, b;
- void *ptr;
-
- a = gem_create(A, 4096);
- b = gem_open(B, gem_flink(A, a));
-
- mmap_arg.handle = a;
- if (mmap_offset_ioctl(A, &mmap_arg)) {
- close(A);
- close(B);
- continue;
- }
- offset_a = mmap_arg.offset;
-
- mmap_arg.handle = b;
- igt_assert_eq(mmap_offset_ioctl(B, &mmap_arg), 0);
- offset_b = mmap_arg.offset;
-
- igt_info("A[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
- t->name, A, a, offset_a);
- igt_info("B[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
- t->name, B, b, offset_b);
+ for_each_memory_region(r, i915) {
+ igt_info("%s\n", r->name);
+ for_each_mmap_offset_type(i915, t) {
+ struct drm_i915_gem_mmap_offset mmap_arg = {
+ .flags = t->type
+ };
+ int A = gem_reopen_driver(i915);
+ int B = gem_reopen_driver(i915);
+ uint64_t offset_a, offset_b;
+ uint32_t a, b;
+ void *ptr;
+
+ a = gem_create_in_memory_region_list(A, 4096, 0, &r->ci, 1);
+ b = gem_open(B, gem_flink(A, a));
+
+ mmap_arg.handle = a;
+ if (mmap_offset_ioctl(A, &mmap_arg)) {
+ close(A);
+ close(B);
+ continue;
+ }
+ offset_a = mmap_arg.offset;
- errno = 0;
- ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, i915, offset_a);
- igt_assert(ptr == MAP_FAILED);
- igt_assert_eq(errno, EACCES);
+ mmap_arg.handle = b;
+ igt_assert_eq(mmap_offset_ioctl(B, &mmap_arg), 0);
+ offset_b = mmap_arg.offset;
- errno = 0;
- ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, i915, offset_b);
- igt_assert(ptr == MAP_FAILED);
- igt_assert_eq(errno, EACCES);
+ igt_info("\tA[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
+ t->name, A, a, offset_a);
+ igt_info("\tB[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
+ t->name, B, b, offset_b);
- if (offset_a != offset_b) {
errno = 0;
- ptr = mmap(0, 4096, PROT_READ, MAP_SHARED, B, offset_a);
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, i915, offset_a);
igt_assert(ptr == MAP_FAILED);
igt_assert_eq(errno, EACCES);
errno = 0;
- ptr = mmap(0, 4096, PROT_READ, MAP_SHARED, A, offset_b);
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, i915, offset_b);
igt_assert(ptr == MAP_FAILED);
igt_assert_eq(errno, EACCES);
- }
- close(B);
+ if (offset_a != offset_b) {
+ errno = 0;
+ ptr = mmap(0, 4096, PROT_READ, MAP_SHARED, B, offset_a);
+ igt_assert(ptr == MAP_FAILED);
+ igt_assert_eq(errno, EACCES);
- ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
- igt_assert(ptr != MAP_FAILED);
- munmap(ptr, 4096);
+ errno = 0;
+ ptr = mmap(0, 4096, PROT_READ, MAP_SHARED, A, offset_b);
+ igt_assert(ptr == MAP_FAILED);
+ igt_assert_eq(errno, EACCES);
+ }
- close(A);
+ close(B);
+
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
+ igt_assert(ptr != MAP_FAILED);
+ munmap(ptr, 4096);
+
+ close(A);
- ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
- igt_assert(ptr == MAP_FAILED);
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
+ igt_assert(ptr == MAP_FAILED);
+ }
}
}
--
2.34.1
More information about the igt-dev
mailing list