[igt-dev] [PATCH i-g-t 08/12] i915/gem_mmap_offset: Verify all regions remain in isolation

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Fri Sep 2 06:25:21 UTC 2022


On Thu, Sep 01, 2022 at 01:44:38PM +0200, Zbigniew Kempczyński wrote:
> 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>
> ---
>  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 806a9d68f4..c392dc2092 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
>

Looks good.

Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>

--
Zbigniew 


More information about the igt-dev mailing list