Skip to content
/ linux Public

Commit 7ac6501

Browse files
AKoskovichSasha Levin
authored andcommitted
power: reset: nvmem-reboot-mode: respect cell size for nvmem_cell_write
[ Upstream commit 36b0562 ] Some platforms expose reboot mode cells that are smaller than an unsigned int, in which cases lead to write failures. Read the cell first to determine actual size and only write the number of bytes the cell can hold. Fixes: 7a78a7f ("power: reset: nvmem-reboot-mode: use NVMEM as reboot mode write interface") Signed-off-by: Alexander Koskovich <akoskovich@pm.me> Link: https://patch.msgid.link/20251214191529.2470580-1-akoskovich@pm.me Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 2078830 commit 7ac6501

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

drivers/power/reset/nvmem-reboot-mode.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <linux/nvmem-consumer.h>
1111
#include <linux/platform_device.h>
1212
#include <linux/reboot-mode.h>
13+
#include <linux/slab.h>
1314

1415
struct nvmem_reboot_mode {
1516
struct reboot_mode_driver reboot;
@@ -19,12 +20,22 @@ struct nvmem_reboot_mode {
1920
static int nvmem_reboot_mode_write(struct reboot_mode_driver *reboot,
2021
unsigned int magic)
2122
{
22-
int ret;
2323
struct nvmem_reboot_mode *nvmem_rbm;
24+
size_t buf_len;
25+
void *buf;
26+
int ret;
2427

2528
nvmem_rbm = container_of(reboot, struct nvmem_reboot_mode, reboot);
2629

27-
ret = nvmem_cell_write(nvmem_rbm->cell, &magic, sizeof(magic));
30+
buf = nvmem_cell_read(nvmem_rbm->cell, &buf_len);
31+
if (IS_ERR(buf))
32+
return PTR_ERR(buf);
33+
kfree(buf);
34+
35+
if (buf_len > sizeof(magic))
36+
return -EINVAL;
37+
38+
ret = nvmem_cell_write(nvmem_rbm->cell, &magic, buf_len);
2839
if (ret < 0)
2940
dev_err(reboot->dev, "update reboot mode bits failed\n");
3041

0 commit comments

Comments
 (0)