aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorJulia Lawall <Julia.Lawall@lip6.fr>2012-03-17 13:03:29 -0400
committerDave Airlie <airlied@redhat.com>2012-03-20 04:45:27 -0400
commitf48bb04a56fd1f582a45f3882255477417bc0ed7 (patch)
treea73a7ced4a30a128a3b41e2ebf4537dba8a416ba /drivers/gpu/drm
parentabc8113fe56948858ff44f4b1795875be0cb5e99 (diff)
drivers/gpu/drm/radeon/radeon_cs.c: eliminate possible double free
The function radeon_cs_parser_init is only called from two places, in drivers/gpu/drm/radeon/radeon_cs.c and drivers/gpu/drm/radeon/r600_cs.c. In each case, if the call fails another function is called that frees all of the kdata and dpage information in the chunks array. So this information should not be freed in radeon_cs_parser_init as well. Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr> Reviewed-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c16
1 files changed, 2 insertions, 14 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 9b4124ee17f7..d9d9f5a59c42 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -243,20 +243,11 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
243 if ((p->cs_flags & RADEON_CS_USE_VM) && 243 if ((p->cs_flags & RADEON_CS_USE_VM) &&
244 !p->rdev->vm_manager.enabled) { 244 !p->rdev->vm_manager.enabled) {
245 DRM_ERROR("VM not active on asic!\n"); 245 DRM_ERROR("VM not active on asic!\n");
246 if (p->chunk_relocs_idx != -1)
247 kfree(p->chunks[p->chunk_relocs_idx].kdata);
248 if (p->chunk_flags_idx != -1)
249 kfree(p->chunks[p->chunk_flags_idx].kdata);
250 return -EINVAL; 246 return -EINVAL;
251 } 247 }
252 248
253 if (radeon_cs_get_ring(p, ring, priority)) { 249 if (radeon_cs_get_ring(p, ring, priority))
254 if (p->chunk_relocs_idx != -1)
255 kfree(p->chunks[p->chunk_relocs_idx].kdata);
256 if (p->chunk_flags_idx != -1)
257 kfree(p->chunks[p->chunk_flags_idx].kdata);
258 return -EINVAL; 250 return -EINVAL;
259 }
260 251
261 252
262 /* deal with non-vm */ 253 /* deal with non-vm */
@@ -271,11 +262,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
271 p->chunks[p->chunk_ib_idx].kpage[0] = kmalloc(PAGE_SIZE, GFP_KERNEL); 262 p->chunks[p->chunk_ib_idx].kpage[0] = kmalloc(PAGE_SIZE, GFP_KERNEL);
272 p->chunks[p->chunk_ib_idx].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL); 263 p->chunks[p->chunk_ib_idx].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL);
273 if (p->chunks[p->chunk_ib_idx].kpage[0] == NULL || 264 if (p->chunks[p->chunk_ib_idx].kpage[0] == NULL ||
274 p->chunks[p->chunk_ib_idx].kpage[1] == NULL) { 265 p->chunks[p->chunk_ib_idx].kpage[1] == NULL)
275 kfree(p->chunks[p->chunk_ib_idx].kpage[0]);
276 kfree(p->chunks[p->chunk_ib_idx].kpage[1]);
277 return -ENOMEM; 266 return -ENOMEM;
278 }
279 p->chunks[p->chunk_ib_idx].kpage_idx[0] = -1; 267 p->chunks[p->chunk_ib_idx].kpage_idx[0] = -1;
280 p->chunks[p->chunk_ib_idx].kpage_idx[1] = -1; 268 p->chunks[p->chunk_ib_idx].kpage_idx[1] = -1;
281 p->chunks[p->chunk_ib_idx].last_copied_page = -1; 269 p->chunks[p->chunk_ib_idx].last_copied_page = -1;