[PATCH v3 0/3] nvmem: fix out-of-bounds reboot-mode write

Jennifer Berringer
2024-11-04T15:24:29Z

Hi all,

These patches fix a small out-of-bounds write when using the
nvmem-reboot-mode driver on Qualcomm SA8775P, such as by executing
"reboot bootloader" in a shell. Relevant error log:

BUG: KASAN: slab-out-of-bounds in nvmem_cell_prepare_write_buffer+0x144/0x47c
Write of size 4 at addr ffff19dd8e1a37a0 by task systemd-shutdow/1
Hardware name: Qualcomm SA8775P Ride (DT)
Call trace:
nvmem_cell_prepare_write_buffer
nvmem_cell_write
nvmem_reboot_mode_write
The buggy address is located 0 bytes inside of
allocated 1-byte region

This problem manifested because the devicetree file sa8775p-pmics.dtsi
specifies its reboot-mode cell with "reg = <0x48 0x1>" and so expects
the reboot mode write to only be 1 byte rather than 4. Other in-tree
devicetrees that seem likely affected include pmk8350 and pmk8550.

These changes add the missing bounds check to nvmem_cell_write and make
nvmem-reboot-mode able to only write as many bytes as it needs to.

v2:
- Added missing function definition for CONFIG_NVMEM=n

v3:
- Accepted suggestion for changing nvmem_cell_write bounds check

---
Jennifer Berringer (3):
nvmem: core: improve range check for nvmem_cell_write()
nvmem: core: add nvmem_cell_write_variable_u32()
power: reset: nvmem-reboot-mode: fix write for small cells

drivers/nvmem/core.c | 26 +++++++++++++++++++++++++
drivers/power/reset/nvmem-reboot-mode.c | 2 +-
include/linux/nvmem-consumer.h | 6 ++++++
3 files changed, 33 insertions(+), 1 deletion(-)

base-commit: 98f7e32f20d28ec452afb208f9cffc08448a2652
--
2.46.2