video: tegra: host: validate error notifier offset
Konsta Holtta [Tue, 8 Mar 2016 11:56:19 +0000 (13:56 +0200)]
Make sure that the notifier object fits within the supplied buffer.

Bug 1739183

Change-Id: Ifbf46eddea86bedf0236851ea1c3f73e5f820beb
Signed-off-by: Konsta Holtta <kholtta@nvidia.com>
Reviewed-on: http://git-master/r/1026409
(cherry picked from commit 4086d2137e9b51137aa335fa264d924c73dea5fc)
Reviewed-on: http://git-master/r/1029382
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Manish Tuteja <mtuteja@nvidia.com>
Tested-by: Manish Tuteja <mtuteja@nvidia.com>

drivers/video/tegra/host/bus_client.c

index d552c14..5de6c30 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Tegra Graphics Host Client Module
  *
- * Copyright (c) 2010-2015, NVIDIA Corporation. All rights reserved.
+ * Copyright (c) 2010-2016, NVIDIA Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -419,6 +419,7 @@ static int nvhost_init_error_notifier(struct nvhost_channel_userctx *ctx,
 {
        struct dma_buf *dmabuf;
        void *va;
+       u64 end = args->offset + sizeof(struct nvhost_notification);
 
        /* are we releasing old reference? */
        if (!args->mem) {
@@ -435,6 +436,12 @@ static int nvhost_init_error_notifier(struct nvhost_channel_userctx *ctx,
                return -EINVAL;
        }
 
+       if (end > dmabuf->size || end < sizeof(struct nvhost_notification)) {
+               dma_buf_put(dmabuf);
+               pr_err("%s: invalid offset\n", __func__);
+               return -EINVAL;
+       }
+
        /* map handle and clear error notifier struct */
        va = dma_buf_vmap(dmabuf);
        if (!va) {