Message ID | 20220125182217.2605202-1-eugenis@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] arm64: extable: fix load_unaligned_zeropad() reg indices | expand |
On Tue, 25 Jan 2022 10:22:17 -0800, Evgenii Stepanov wrote: > In ex_handler_load_unaligned_zeropad() we erroneously extract the data and > addr register indices from ex->type rather than ex->data. As ex->type will > contain EX_TYPE_LOAD_UNALIGNED_ZEROPAD (i.e. 4): > * We'll always treat X0 as the address register, since EX_DATA_REG_ADDR is > extracted from bits [9:5]. Thus, we may attempt to dereference an > arbitrary address as X0 may hold an arbitrary value. > * We'll always treat X4 as the data register, since EX_DATA_REG_DATA is > extracted from bits [4:0]. Thus we will corrupt X4 and cause arbitrary > behaviour within load_unaligned_zeropad() and its caller. > > [...] Applied to arm64 (for-next/fixes), thanks! [1/1] arm64: extable: fix load_unaligned_zeropad() reg indices https://git.kernel.org/arm64/c/afa1bf69aac3
diff --git a/arch/arm64/mm/extable.c b/arch/arm64/mm/extable.c index c0181e60cc98..489455309695 100644 --- a/arch/arm64/mm/extable.c +++ b/arch/arm64/mm/extable.c @@ -40,8 +40,8 @@ static bool ex_handler_load_unaligned_zeropad(const struct exception_table_entry *ex, struct pt_regs *regs) { - int reg_data = FIELD_GET(EX_DATA_REG_DATA, ex->type); - int reg_addr = FIELD_GET(EX_DATA_REG_ADDR, ex->type); + int reg_data = FIELD_GET(EX_DATA_REG_DATA, ex->data); + int reg_addr = FIELD_GET(EX_DATA_REG_ADDR, ex->data); unsigned long data, addr, offset; addr = pt_regs_read_reg(regs, reg_addr);