Skip to content

Commit 42cd402

Browse files
krzkgregkh
authored andcommitted
rpmsg: Fix kfree() of static memory on setting driver_override
The driver_override field from platform driver should not be initialized from static memory (string literal) because the core later kfree() it, for example when driver_override is set via sysfs. Use dedicated helper to set driver_override properly. Fixes: 950a738 ("rpmsg: Turn name service into a stand alone driver") Fixes: c0cdc19 ("rpmsg: Driver for user space endpoint interface") Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Link: https://lore.kernel.org/r/20220419113435.246203-13-krzysztof.kozlowski@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent e5f8913 commit 42cd402

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
lines changed

drivers/rpmsg/rpmsg_internal.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,19 @@ int rpmsg_release_channel(struct rpmsg_device *rpdev,
9494
*/
9595
static inline int rpmsg_ctrldev_register_device(struct rpmsg_device *rpdev)
9696
{
97+
int ret;
98+
9799
strcpy(rpdev->id.name, "rpmsg_ctrl");
98-
rpdev->driver_override = "rpmsg_ctrl";
100+
ret = driver_set_override(&rpdev->dev, &rpdev->driver_override,
101+
rpdev->id.name, strlen(rpdev->id.name));
102+
if (ret)
103+
return ret;
104+
105+
ret = rpmsg_register_device(rpdev);
106+
if (ret)
107+
kfree(rpdev->driver_override);
99108

100-
return rpmsg_register_device(rpdev);
109+
return ret;
101110
}
102111

103112
#endif

drivers/rpmsg/rpmsg_ns.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,22 @@
2020
*/
2121
int rpmsg_ns_register_device(struct rpmsg_device *rpdev)
2222
{
23+
int ret;
24+
2325
strcpy(rpdev->id.name, "rpmsg_ns");
24-
rpdev->driver_override = "rpmsg_ns";
26+
ret = driver_set_override(&rpdev->dev, &rpdev->driver_override,
27+
rpdev->id.name, strlen(rpdev->id.name));
28+
if (ret)
29+
return ret;
30+
2531
rpdev->src = RPMSG_NS_ADDR;
2632
rpdev->dst = RPMSG_NS_ADDR;
2733

28-
return rpmsg_register_device(rpdev);
34+
ret = rpmsg_register_device(rpdev);
35+
if (ret)
36+
kfree(rpdev->driver_override);
37+
38+
return ret;
2939
}
3040
EXPORT_SYMBOL(rpmsg_ns_register_device);
3141

include/linux/rpmsg.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ struct rpmsg_channel_info {
4141
* rpmsg_device - device that belong to the rpmsg bus
4242
* @dev: the device struct
4343
* @id: device id (used to match between rpmsg drivers and devices)
44-
* @driver_override: driver name to force a match
44+
* @driver_override: driver name to force a match; do not set directly,
45+
* because core frees it; use driver_set_override() to
46+
* set or clear it.
4547
* @src: local address
4648
* @dst: destination address
4749
* @ept: the rpmsg endpoint of this channel
@@ -51,7 +53,7 @@ struct rpmsg_channel_info {
5153
struct rpmsg_device {
5254
struct device dev;
5355
struct rpmsg_device_id id;
54-
char *driver_override;
56+
const char *driver_override;
5557
u32 src;
5658
u32 dst;
5759
struct rpmsg_endpoint *ept;

0 commit comments

Comments
 (0)