Skip to content

Commit 36b0562

Browse files
AKoskovichsre
authored andcommitted
power: reset: nvmem-reboot-mode: respect cell size for nvmem_cell_write
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>
1 parent 8d59cf3 commit 36b0562

1 file changed

Lines changed: 13 additions & 2 deletions

File tree

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)