diff options
author | Deepak Goyal <dgoyal@nvidia.com> | 2018-02-01 00:30:27 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-02-06 13:01:48 -0500 |
commit | 9402f4165b7a5568363f793e47bb893719639ca2 (patch) | |
tree | 7f09cac7392366c77e5da83e3b4daabb6f023b83 /drivers/gpu/nvgpu/gp106/acr_gp106.c | |
parent | 0c0d6ba4880f841e26183c26637e54d7a7a9a4dc (diff) |
gpu: nvgpu: fix out of bounds access
lsf_ucode_desc_v1 has more size than signature bin.
In memcpy(dest, src, size_to_copy) usage, "size_to_copy"
is more than "size of the src" which is causing out of bounds
access.
Bug 2051856
NVGPU-507
Change-Id: I0aad34df39f95f7e95ccb10539e1fae9f65361a8
Signed-off-by: Deepak Goyal <dgoyal@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1650140
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gp106/acr_gp106.c')
-rw-r--r-- | drivers/gpu/nvgpu/gp106/acr_gp106.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gp106/acr_gp106.c b/drivers/gpu/nvgpu/gp106/acr_gp106.c index 31ddecf0..5ab8cfcc 100644 --- a/drivers/gpu/nvgpu/gp106/acr_gp106.c +++ b/drivers/gpu/nvgpu/gp106/acr_gp106.c | |||
@@ -153,7 +153,8 @@ int pmu_ucode_details(struct gk20a *g, struct flcn_ucode_img_v1 *p_img) | |||
153 | err = -ENOMEM; | 153 | err = -ENOMEM; |
154 | goto release_sig; | 154 | goto release_sig; |
155 | } | 155 | } |
156 | memcpy(lsf_desc, (void *)pmu_sig->data, sizeof(struct lsf_ucode_desc_v1)); | 156 | memcpy(lsf_desc, (void *)pmu_sig->data, |
157 | min_t(size_t, sizeof(*lsf_desc), pmu_sig->size)); | ||
157 | lsf_desc->falcon_id = LSF_FALCON_ID_PMU; | 158 | lsf_desc->falcon_id = LSF_FALCON_ID_PMU; |
158 | 159 | ||
159 | p_img->desc = pmu->desc_v1; | 160 | p_img->desc = pmu->desc_v1; |
@@ -218,7 +219,8 @@ int fecs_ucode_details(struct gk20a *g, struct flcn_ucode_img_v1 *p_img) | |||
218 | err = -ENOMEM; | 219 | err = -ENOMEM; |
219 | goto rel_sig; | 220 | goto rel_sig; |
220 | } | 221 | } |
221 | memcpy(lsf_desc, (void *)fecs_sig->data, sizeof(struct lsf_ucode_desc_v1)); | 222 | memcpy(lsf_desc, (void *)fecs_sig->data, |
223 | min_t(size_t, sizeof(*lsf_desc), fecs_sig->size)); | ||
222 | lsf_desc->falcon_id = LSF_FALCON_ID_FECS; | 224 | lsf_desc->falcon_id = LSF_FALCON_ID_FECS; |
223 | 225 | ||
224 | p_img->desc = nvgpu_kzalloc(g, sizeof(struct pmu_ucode_desc_v1)); | 226 | p_img->desc = nvgpu_kzalloc(g, sizeof(struct pmu_ucode_desc_v1)); |
@@ -314,7 +316,7 @@ int gpccs_ucode_details(struct gk20a *g, struct flcn_ucode_img_v1 *p_img) | |||
314 | goto rel_sig; | 316 | goto rel_sig; |
315 | } | 317 | } |
316 | memcpy(lsf_desc, (void *)gpccs_sig->data, | 318 | memcpy(lsf_desc, (void *)gpccs_sig->data, |
317 | sizeof(struct lsf_ucode_desc_v1)); | 319 | min_t(size_t, sizeof(*lsf_desc), gpccs_sig->size)); |
318 | lsf_desc->falcon_id = LSF_FALCON_ID_GPCCS; | 320 | lsf_desc->falcon_id = LSF_FALCON_ID_GPCCS; |
319 | 321 | ||
320 | p_img->desc = nvgpu_kzalloc(g, sizeof(struct pmu_ucode_desc_v1)); | 322 | p_img->desc = nvgpu_kzalloc(g, sizeof(struct pmu_ucode_desc_v1)); |