Skip to content

Commit 60ccb31

Browse files
committed
Merge tag 'drm-intel-fixes-2017-11-08' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
- Fix possible NULL dereference (Chris). - Avoid miss usage of syncobj by rejecting unknown flags (Tvrtko). * tag 'drm-intel-fixes-2017-11-08' of git://anongit.freedesktop.org/drm/drm-intel: drm/i915: Deconstruct struct sgt_dma initialiser drm/i915: Reject unknown syncobj flags
2 parents 17208f1 + 423a8a9 commit 60ccb31

3 files changed

Lines changed: 18 additions & 16 deletions

File tree

drivers/gpu/drm/i915/i915_gem_execbuffer.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2094,13 +2094,21 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
20942094
goto err;
20952095
}
20962096

2097+
if (fence.flags & __I915_EXEC_FENCE_UNKNOWN_FLAGS) {
2098+
err = -EINVAL;
2099+
goto err;
2100+
}
2101+
20972102
syncobj = drm_syncobj_find(file, fence.handle);
20982103
if (!syncobj) {
20992104
DRM_DEBUG("Invalid syncobj handle provided\n");
21002105
err = -ENOENT;
21012106
goto err;
21022107
}
21032108

2109+
BUILD_BUG_ON(~(ARCH_KMALLOC_MINALIGN - 1) &
2110+
~__I915_EXEC_FENCE_UNKNOWN_FLAGS);
2111+
21042112
fences[n] = ptr_pack_bits(syncobj, fence.flags, 2);
21052113
}
21062114

drivers/gpu/drm/i915/i915_gem_gtt.c

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -832,10 +832,14 @@ static void gen8_ppgtt_clear_4lvl(struct i915_address_space *vm,
832832
}
833833
}
834834

835-
struct sgt_dma {
835+
static inline struct sgt_dma {
836836
struct scatterlist *sg;
837837
dma_addr_t dma, max;
838-
};
838+
} sgt_dma(struct i915_vma *vma) {
839+
struct scatterlist *sg = vma->pages->sgl;
840+
dma_addr_t addr = sg_dma_address(sg);
841+
return (struct sgt_dma) { sg, addr, addr + sg->length };
842+
}
839843

840844
struct gen8_insert_pte {
841845
u16 pml4e;
@@ -916,11 +920,7 @@ static void gen8_ppgtt_insert_3lvl(struct i915_address_space *vm,
916920
u32 unused)
917921
{
918922
struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
919-
struct sgt_dma iter = {
920-
.sg = vma->pages->sgl,
921-
.dma = sg_dma_address(iter.sg),
922-
.max = iter.dma + iter.sg->length,
923-
};
923+
struct sgt_dma iter = sgt_dma(vma);
924924
struct gen8_insert_pte idx = gen8_insert_pte(vma->node.start);
925925

926926
gen8_ppgtt_insert_pte_entries(ppgtt, &ppgtt->pdp, &iter, &idx,
@@ -933,11 +933,7 @@ static void gen8_ppgtt_insert_4lvl(struct i915_address_space *vm,
933933
u32 unused)
934934
{
935935
struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
936-
struct sgt_dma iter = {
937-
.sg = vma->pages->sgl,
938-
.dma = sg_dma_address(iter.sg),
939-
.max = iter.dma + iter.sg->length,
940-
};
936+
struct sgt_dma iter = sgt_dma(vma);
941937
struct i915_page_directory_pointer **pdps = ppgtt->pml4.pdps;
942938
struct gen8_insert_pte idx = gen8_insert_pte(vma->node.start);
943939

@@ -1632,13 +1628,10 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
16321628
unsigned act_pt = first_entry / GEN6_PTES;
16331629
unsigned act_pte = first_entry % GEN6_PTES;
16341630
const u32 pte_encode = vm->pte_encode(0, cache_level, flags);
1635-
struct sgt_dma iter;
1631+
struct sgt_dma iter = sgt_dma(vma);
16361632
gen6_pte_t *vaddr;
16371633

16381634
vaddr = kmap_atomic_px(ppgtt->pd.page_table[act_pt]);
1639-
iter.sg = vma->pages->sgl;
1640-
iter.dma = sg_dma_address(iter.sg);
1641-
iter.max = iter.dma + iter.sg->length;
16421635
do {
16431636
vaddr[act_pte] = pte_encode | GEN6_PTE_ADDR_ENCODE(iter.dma);
16441637

include/uapi/drm/i915_drm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,7 @@ struct drm_i915_gem_exec_fence {
829829

830830
#define I915_EXEC_FENCE_WAIT (1<<0)
831831
#define I915_EXEC_FENCE_SIGNAL (1<<1)
832+
#define __I915_EXEC_FENCE_UNKNOWN_FLAGS (-(I915_EXEC_FENCE_SIGNAL << 1))
832833
__u32 flags;
833834
};
834835

0 commit comments

Comments
 (0)