powerpc/lib: Validate size for vector operations
[ Upstream commit 8f9abaa6d7de0a70fc68acaedce290c1f96e2e59 ] Some of the fp/vmx code in sstep.c assume a certain maximum size for the instructions being emulated. The size of those operations however is determined separately in analyse_instr(). Add a check to validate the assumption on the maximum size of the operations, so as to prevent any unintended kernel stack corruption. Signed-off-by: Naveen N Rao <naveen@kernel.org> Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org> Build-tested-by: Gustavo A. R. Silva <gustavoars@kernel.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20231123071705.397625-1-naveen@kernel.org Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
0be5614f26
commit
abd26515d4
|
@ -586,6 +586,8 @@ static int do_fp_load(struct instruction_op *op, unsigned long ea,
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
nb = GETSIZE(op->type);
|
nb = GETSIZE(op->type);
|
||||||
|
if (nb > sizeof(u))
|
||||||
|
return -EINVAL;
|
||||||
if (!address_ok(regs, ea, nb))
|
if (!address_ok(regs, ea, nb))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
rn = op->reg;
|
rn = op->reg;
|
||||||
|
@ -636,6 +638,8 @@ static int do_fp_store(struct instruction_op *op, unsigned long ea,
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
nb = GETSIZE(op->type);
|
nb = GETSIZE(op->type);
|
||||||
|
if (nb > sizeof(u))
|
||||||
|
return -EINVAL;
|
||||||
if (!address_ok(regs, ea, nb))
|
if (!address_ok(regs, ea, nb))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
rn = op->reg;
|
rn = op->reg;
|
||||||
|
@ -680,6 +684,9 @@ static nokprobe_inline int do_vec_load(int rn, unsigned long ea,
|
||||||
u8 b[sizeof(__vector128)];
|
u8 b[sizeof(__vector128)];
|
||||||
} u = {};
|
} u = {};
|
||||||
|
|
||||||
|
if (size > sizeof(u))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!address_ok(regs, ea & ~0xfUL, 16))
|
if (!address_ok(regs, ea & ~0xfUL, 16))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
/* align to multiple of size */
|
/* align to multiple of size */
|
||||||
|
@ -707,6 +714,9 @@ static nokprobe_inline int do_vec_store(int rn, unsigned long ea,
|
||||||
u8 b[sizeof(__vector128)];
|
u8 b[sizeof(__vector128)];
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
|
if (size > sizeof(u))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!address_ok(regs, ea & ~0xfUL, 16))
|
if (!address_ok(regs, ea & ~0xfUL, 16))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
/* align to multiple of size */
|
/* align to multiple of size */
|
||||||
|
|
Loading…
Reference in New Issue