Commit 8d532528 authored by Russell King (Oracle)'s avatar Russell King (Oracle)
Browse files

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: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
parent e8f897f4
Loading
Loading
Loading
Loading
+33 −2
Original line number Diff line number Diff line
@@ -158,23 +158,54 @@ vclkdev_alloc(struct clk_hw *hw, const char *con_id, const char *dev_fmt,
	va_list ap)
{
	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);
	if (!cla)
		return NULL;

	va_copy(ap_copy, ap);

	cla->cl.clk_hw = hw;
	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;
	}

	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;
	}

	va_end(ap_copy);

	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 *