tracing/boot: Replace strlcpy with strscpy
strlcpy() reads the entire source buffer first. This read may exceed the destination size limit. This is both inefficient and can lead to linear read overflows if a source string is not NUL-terminated [1]. In an effort to remove strlcpy() completely [2], replace strlcpy() here with strscpy(). Direct replacement is safe here since return value of -E2BIG is used to check for truncation instead of sizeof(dest). [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy [2] https://github.com/KSPP/linux/issues/89 Link: https://lore.kernel.org/linux-trace-kernel/20230613004125.3539934-1-azeemshaikh38@gmail.com Cc: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com> Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
parent
e88ed227f6
commit
38638ffa60
@ -31,7 +31,7 @@ trace_boot_set_instance_options(struct trace_array *tr, struct xbc_node *node)
|
|||||||
|
|
||||||
/* Common ftrace options */
|
/* Common ftrace options */
|
||||||
xbc_node_for_each_array_value(node, "options", anode, p) {
|
xbc_node_for_each_array_value(node, "options", anode, p) {
|
||||||
if (strlcpy(buf, p, ARRAY_SIZE(buf)) >= ARRAY_SIZE(buf)) {
|
if (strscpy(buf, p, ARRAY_SIZE(buf)) == -E2BIG) {
|
||||||
pr_err("String is too long: %s\n", p);
|
pr_err("String is too long: %s\n", p);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -87,7 +87,7 @@ trace_boot_enable_events(struct trace_array *tr, struct xbc_node *node)
|
|||||||
const char *p;
|
const char *p;
|
||||||
|
|
||||||
xbc_node_for_each_array_value(node, "events", anode, p) {
|
xbc_node_for_each_array_value(node, "events", anode, p) {
|
||||||
if (strlcpy(buf, p, ARRAY_SIZE(buf)) >= ARRAY_SIZE(buf)) {
|
if (strscpy(buf, p, ARRAY_SIZE(buf)) == -E2BIG) {
|
||||||
pr_err("String is too long: %s\n", p);
|
pr_err("String is too long: %s\n", p);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -486,7 +486,7 @@ trace_boot_init_one_event(struct trace_array *tr, struct xbc_node *gnode,
|
|||||||
|
|
||||||
p = xbc_node_find_value(enode, "filter", NULL);
|
p = xbc_node_find_value(enode, "filter", NULL);
|
||||||
if (p && *p != '\0') {
|
if (p && *p != '\0') {
|
||||||
if (strlcpy(buf, p, ARRAY_SIZE(buf)) >= ARRAY_SIZE(buf))
|
if (strscpy(buf, p, ARRAY_SIZE(buf)) == -E2BIG)
|
||||||
pr_err("filter string is too long: %s\n", p);
|
pr_err("filter string is too long: %s\n", p);
|
||||||
else if (apply_event_filter(file, buf) < 0)
|
else if (apply_event_filter(file, buf) < 0)
|
||||||
pr_err("Failed to apply filter: %s\n", buf);
|
pr_err("Failed to apply filter: %s\n", buf);
|
||||||
@ -494,7 +494,7 @@ trace_boot_init_one_event(struct trace_array *tr, struct xbc_node *gnode,
|
|||||||
|
|
||||||
if (IS_ENABLED(CONFIG_HIST_TRIGGERS)) {
|
if (IS_ENABLED(CONFIG_HIST_TRIGGERS)) {
|
||||||
xbc_node_for_each_array_value(enode, "actions", anode, p) {
|
xbc_node_for_each_array_value(enode, "actions", anode, p) {
|
||||||
if (strlcpy(buf, p, ARRAY_SIZE(buf)) >= ARRAY_SIZE(buf))
|
if (strscpy(buf, p, ARRAY_SIZE(buf)) == -E2BIG)
|
||||||
pr_err("action string is too long: %s\n", p);
|
pr_err("action string is too long: %s\n", p);
|
||||||
else if (trigger_process_regex(file, buf) < 0)
|
else if (trigger_process_regex(file, buf) < 0)
|
||||||
pr_err("Failed to apply an action: %s\n", p);
|
pr_err("Failed to apply an action: %s\n", p);
|
||||||
|
Loading…
Reference in New Issue
Block a user