aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2013-01-09 16:40:42 -0500
committerAlex Deucher <alexander.deucher@amd.com>2013-01-10 17:05:38 -0500
commit9305ede6afe2998b391cd225e02a18f37d62028e (patch)
tree3f5256256b89fe06c94a23fa8f29fb792799ea15
parent51861d4eebc2ddc25c77084343d060fa79f6e291 (diff)
radeon/kms: fix dma relocation checking
We were checking the index against the size of the relocation buffer instead of against the last index. This fix kernel segfault when userspace submit ill formated command stream/relocation buffer pair. Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/r600_cs.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c
index 6858a4068f7b..69ec24ab8d63 100644
--- a/drivers/gpu/drm/radeon/r600_cs.c
+++ b/drivers/gpu/drm/radeon/r600_cs.c
@@ -2563,16 +2563,16 @@ int r600_dma_cs_next_reloc(struct radeon_cs_parser *p,
2563 struct radeon_cs_chunk *relocs_chunk; 2563 struct radeon_cs_chunk *relocs_chunk;
2564 unsigned idx; 2564 unsigned idx;
2565 2565
2566 *cs_reloc = NULL;
2566 if (p->chunk_relocs_idx == -1) { 2567 if (p->chunk_relocs_idx == -1) {
2567 DRM_ERROR("No relocation chunk !\n"); 2568 DRM_ERROR("No relocation chunk !\n");
2568 return -EINVAL; 2569 return -EINVAL;
2569 } 2570 }
2570 *cs_reloc = NULL;
2571 relocs_chunk = &p->chunks[p->chunk_relocs_idx]; 2571 relocs_chunk = &p->chunks[p->chunk_relocs_idx];
2572 idx = p->dma_reloc_idx; 2572 idx = p->dma_reloc_idx;
2573 if (idx >= relocs_chunk->length_dw) { 2573 if (idx >= p->nrelocs) {
2574 DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", 2574 DRM_ERROR("Relocs at %d after relocations chunk end %d !\n",
2575 idx, relocs_chunk->length_dw); 2575 idx, p->nrelocs);
2576 return -EINVAL; 2576 return -EINVAL;
2577 } 2577 }
2578 *cs_reloc = p->relocs_ptr[idx]; 2578 *cs_reloc = p->relocs_ptr[idx];