mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-20 04:19:41 +00:00
clkdev: report over-sized strings when creating clkdev entries
Report an error when an attempt to register a clkdev entry results in a truncated string so the problem can be easily spotted. Reported by: Duanqiang Wen <duanqiangwen@net-swift.com> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
This commit is contained in:
parent
e8f897f4af
commit
8d532528ff
@ -158,23 +158,54 @@ vclkdev_alloc(struct clk_hw *hw, const char *con_id, const char *dev_fmt,
|
|||||||
va_list ap)
|
va_list ap)
|
||||||
{
|
{
|
||||||
struct clk_lookup_alloc *cla;
|
struct clk_lookup_alloc *cla;
|
||||||
|
struct va_format vaf;
|
||||||
|
const char *failure;
|
||||||
|
va_list ap_copy;
|
||||||
|
size_t max_size;
|
||||||
|
ssize_t res;
|
||||||
|
|
||||||
cla = kzalloc(sizeof(*cla), GFP_KERNEL);
|
cla = kzalloc(sizeof(*cla), GFP_KERNEL);
|
||||||
if (!cla)
|
if (!cla)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
va_copy(ap_copy, ap);
|
||||||
|
|
||||||
cla->cl.clk_hw = hw;
|
cla->cl.clk_hw = hw;
|
||||||
if (con_id) {
|
if (con_id) {
|
||||||
strscpy(cla->con_id, con_id, sizeof(cla->con_id));
|
res = strscpy(cla->con_id, con_id, sizeof(cla->con_id));
|
||||||
|
if (res < 0) {
|
||||||
|
max_size = sizeof(cla->con_id);
|
||||||
|
failure = "connection";
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
cla->cl.con_id = cla->con_id;
|
cla->cl.con_id = cla->con_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev_fmt) {
|
if (dev_fmt) {
|
||||||
vscnprintf(cla->dev_id, sizeof(cla->dev_id), dev_fmt, ap);
|
res = vsnprintf(cla->dev_id, sizeof(cla->dev_id), dev_fmt, ap);
|
||||||
|
if (res >= sizeof(cla->dev_id)) {
|
||||||
|
max_size = sizeof(cla->dev_id);
|
||||||
|
failure = "device";
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
cla->cl.dev_id = cla->dev_id;
|
cla->cl.dev_id = cla->dev_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
va_end(ap_copy);
|
||||||
|
|
||||||
return &cla->cl;
|
return &cla->cl;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (dev_fmt)
|
||||||
|
vaf.fmt = dev_fmt;
|
||||||
|
else
|
||||||
|
vaf.fmt = "null-device";
|
||||||
|
vaf.va = &ap_copy;
|
||||||
|
pr_err("%pV:%s: %s ID is greater than %zu\n",
|
||||||
|
&vaf, con_id, failure, max_size);
|
||||||
|
va_end(ap_copy);
|
||||||
|
kfree(cla);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct clk_lookup *
|
static struct clk_lookup *
|
||||||
|
Loading…
x
Reference in New Issue
Block a user