aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2015-06-23 11:07:03 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-06-29 11:21:49 -0400
commit9a5e8fb1c8372ea4b58a76bbb82cb97683bb204b (patch)
treeaf92dc30bcf8d7e8af94f71f6a5bc233ad1e033e
parentb8682ac253bdab6c15678f926bdc028b2e5dc0d2 (diff)
drm/amdgpu: add chunk id validity check
Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 7cd567b268fd..86b78c799176 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -181,8 +181,6 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
181 } 181 }
182 p->chunks[i].chunk_id = user_chunk.chunk_id; 182 p->chunks[i].chunk_id = user_chunk.chunk_id;
183 p->chunks[i].length_dw = user_chunk.length_dw; 183 p->chunks[i].length_dw = user_chunk.length_dw;
184 if (p->chunks[i].chunk_id == AMDGPU_CHUNK_ID_IB)
185 p->num_ibs++;
186 184
187 size = p->chunks[i].length_dw; 185 size = p->chunks[i].length_dw;
188 cdata = (void __user *)(unsigned long)user_chunk.chunk_data; 186 cdata = (void __user *)(unsigned long)user_chunk.chunk_data;
@@ -199,7 +197,12 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
199 goto out; 197 goto out;
200 } 198 }
201 199
202 if (p->chunks[i].chunk_id == AMDGPU_CHUNK_ID_FENCE) { 200 switch (p->chunks[i].chunk_id) {
201 case AMDGPU_CHUNK_ID_IB:
202 p->num_ibs++;
203 break;
204
205 case AMDGPU_CHUNK_ID_FENCE:
203 size = sizeof(struct drm_amdgpu_cs_chunk_fence); 206 size = sizeof(struct drm_amdgpu_cs_chunk_fence);
204 if (p->chunks[i].length_dw * sizeof(uint32_t) >= size) { 207 if (p->chunks[i].length_dw * sizeof(uint32_t) >= size) {
205 uint32_t handle; 208 uint32_t handle;
@@ -221,6 +224,11 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
221 r = -EINVAL; 224 r = -EINVAL;
222 goto out; 225 goto out;
223 } 226 }
227 break;
228
229 default:
230 r = -EINVAL;
231 goto out;
224 } 232 }
225 } 233 }
226 234