summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/nvgpu/gk20a/channel_gk20a.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
index e00a1af5b77d..f64bda9b6dc5 100644
--- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
@@ -1732,6 +1732,7 @@ static int gk20a_channel_wait(struct channel_gk20a *ch,
u32 offset;
unsigned long timeout;
int remain, ret = 0;
+ u64 end;
gk20a_dbg_fn("");
@@ -1747,6 +1748,7 @@ static int gk20a_channel_wait(struct channel_gk20a *ch,
case NVHOST_WAIT_TYPE_NOTIFIER:
id = args->condition.notifier.nvmap_handle;
offset = args->condition.notifier.offset;
+ end = offset + sizeof(struct notification);
dmabuf = dma_buf_get(id);
if (IS_ERR(dmabuf)) {
@@ -1755,6 +1757,12 @@ static int gk20a_channel_wait(struct channel_gk20a *ch,
return -EINVAL;
}
+ if (end > dmabuf->size || end < sizeof(struct notification)) {
+ dma_buf_put(dmabuf);
+ gk20a_err(d, "invalid notifier offset\n");
+ return -EINVAL;
+ }
+
notif = dma_buf_vmap(dmabuf);
if (!notif) {
gk20a_err(d, "failed to map notifier memory");