Skip to content

Commit 7e67617

Browse files
CharlesWu465Leo Yu-Chi Liang
authored andcommitted
riscv: amp: fix rpmsg driver override kfree static memory
User can not modify rpmsg sysfs driver_override file, because rpdev->driver_override is allocate in the static memory. So dynamic allocate memory for rpdev->driver_override. Signed-off-by: Charles Ci-Jyun Wu <[email protected]> Reviewed-by: Dylan Jhong <[email protected]> Reviewed-by: Randolph <[email protected]>
1 parent 145a47e commit 7e67617

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

drivers/rpmsg/rpmsg_internal.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,19 @@ int rpmsg_release_channel(struct rpmsg_device *rpdev,
9090
*/
9191
static inline int rpmsg_chrdev_register_device(struct rpmsg_device *rpdev)
9292
{
93-
strcpy(rpdev->id.name, "rpmsg_chrdev");
94-
rpdev->driver_override = "rpmsg_chrdev";
93+
char *driver = "rpmsg_chrdev", *driver_override;
94+
95+
strcpy(rpdev->id.name, driver);
96+
97+
driver_override = kstrndup(driver, strlen(driver), GFP_KERNEL);
98+
if (!driver_override)
99+
return -ENOMEM;
100+
101+
driver_override[strcspn(driver_override, "\n")] = '\0';
102+
103+
device_lock(&rpdev->dev);
104+
rpdev->driver_override = driver_override;
105+
device_unlock(&rpdev->dev);
95106

96107
return rpmsg_register_device(rpdev);
97108
}

drivers/rpmsg/rpmsg_ns.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,19 @@
2020
*/
2121
int rpmsg_ns_register_device(struct rpmsg_device *rpdev)
2222
{
23-
strcpy(rpdev->id.name, "rpmsg_ns");
24-
rpdev->driver_override = "rpmsg_ns";
23+
char *driver = "rpmsg_ns", *driver_override;
24+
strcpy(rpdev->id.name, driver);
25+
26+
driver_override = kstrndup(driver, strlen(driver), GFP_KERNEL);
27+
if (!driver_override)
28+
return -ENOMEM;
29+
30+
driver_override[strcspn(driver_override, "\n")] = '\0';
31+
32+
device_lock(&rpdev->dev);
33+
rpdev->driver_override = driver_override;
34+
device_unlock(&rpdev->dev);
35+
2536
rpdev->src = RPMSG_NS_ADDR;
2637
rpdev->dst = RPMSG_NS_ADDR;
2738

0 commit comments

Comments
 (0)