summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuus Sliepen <gsliepen@google.com>2023-09-11 09:21:05 +0000
committerGuus Sliepen <gsliepen@google.com>2023-10-08 15:42:56 +0000
commitfb192812bb0feff87f603081741a455f12db1a90 (patch)
tree8dac2d01c9dd3b82c593e564a6d42933e164b9a1
parent1896a2b4ea755ff63e623837bc8cfdd6d9c56adc (diff)
downloadgpu-fb192812bb0feff87f603081741a455f12db1a90.tar.gz
Fix potential out-of-bounds read due to missing bounds check. Bug: 298264460 Signed-off-by: Guus Sliepen <gsliepen@google.com> Change-Id: I57b67a4177e4fe6d84a261eeb00b6b833da5486b Merged-In: I57b67a4177e4fe6d84a261eeb00b6b833da5486b
-rw-r--r--mali_kbase/platform/pixel/pixel_gpu_slc.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/mali_kbase/platform/pixel/pixel_gpu_slc.c b/mali_kbase/platform/pixel/pixel_gpu_slc.c
index c7ec0c9..94409d2 100644
--- a/mali_kbase/platform/pixel/pixel_gpu_slc.c
+++ b/mali_kbase/platform/pixel/pixel_gpu_slc.c
@@ -28,6 +28,7 @@ struct dirty_region {
*
* @buffer_va: Array of buffer base virtual addresses
* @buffer_sizes: Array of buffer sizes
+ * @buffer_count: Number of elements in the va and sizes buffers
* @live_ranges: Array of &struct kbase_pixel_gpu_slc_liveness_mark denoting live ranges for
* each buffer
* @live_ranges_count: Number of elements in the live ranges buffer
@@ -35,6 +36,7 @@ struct dirty_region {
struct gpu_slc_liveness_update_info {
u64* buffer_va;
u64* buffer_sizes;
+ u64 buffer_count;
struct kbase_pixel_gpu_slc_liveness_mark* live_ranges;
u64 live_ranges_count;
};
@@ -234,8 +236,15 @@ static void gpu_slc_liveness_update(struct kbase_context* kctx,
for (i = 0; i < info->live_ranges_count; ++i)
{
struct kbase_va_region *reg;
- u64 const size = info->buffer_sizes[info->live_ranges[i].index];
- u64 const va = info->buffer_va[info->live_ranges[i].index];
+ u64 size;
+ u64 va;
+ u32 index = info->live_ranges[i].index;
+
+ if (unlikely(index >= info->buffer_count))
+ continue;
+
+ size = info->buffer_sizes[index];
+ va = info->buffer_va[index];
reg = gpu_slc_get_region(kctx, va);
if(!reg)
@@ -346,6 +355,7 @@ int gpu_pixel_handle_buffer_liveness_update_ioctl(struct kbase_context* kctx,
info = (struct gpu_slc_liveness_update_info){
.buffer_va = buff,
.buffer_sizes = buff + update->buffer_count,
+ .buffer_count = update->buffer_count,
.live_ranges = (struct kbase_pixel_gpu_slc_liveness_mark*)(buff + update->buffer_count * 2),
.live_ranges_count = update->live_ranges_count,
};