kernel/trace/trace_stack.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
strncpy() is deprecated for NUL-terminated destination buffers and must
be replaced by strscpy().
See issue: https://github.com/KSPP/linux/issues/90
Signed-off-by: Devaansh Kumar <devaanshk840@gmail.com>
---
kernel/trace/trace_stack.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
index 5a48dba912ea..91ed2b76fa4c 100644
--- a/kernel/trace/trace_stack.c
+++ b/kernel/trace/trace_stack.c
@@ -543,8 +543,10 @@ static __init int enable_stacktrace(char *str)
{
int len;
- if ((len = str_has_prefix(str, "_filter=")))
- strncpy(stack_trace_filter_buf, str + len, COMMAND_LINE_SIZE);
+ len = str_has_prefix(str, "_filter=");
+
+ if (len)
+ strscpy(stack_trace_filter_buf, str + len, sizeof(stack_trace_filter_buf));
stack_tracer_enabled = 1;
return 1;
--
2.47.1
On Fri, 4 Apr 2025 19:28:48 +0530
Devaansh Kumar <devaanshk840@gmail.com> wrote:
> --- a/kernel/trace/trace_stack.c
> +++ b/kernel/trace/trace_stack.c
> @@ -543,8 +543,10 @@ static __init int enable_stacktrace(char *str)
> {
> int len;
>
> - if ((len = str_has_prefix(str, "_filter=")))
> - strncpy(stack_trace_filter_buf, str + len, COMMAND_LINE_SIZE);
> + len = str_has_prefix(str, "_filter=");
> +
> + if (len)
> + strscpy(stack_trace_filter_buf, str + len, sizeof(stack_trace_filter_buf));
>
> stack_tracer_enabled = 1;
> return 1;
BTW, why separate out the len? I use this notation quite a bit for
str_has_prefix() checks.
$ git grep '(len = str_has_pref' kernel/trace
kernel/trace/trace_events.c: if (!(len = str_has_prefix(fmt, "REC->")))
kernel/trace/trace_events_filter.c: if ((len = str_has_prefix(str + i, ".ustring"))) {
kernel/trace/trace_events_filter.c: if ((len = str_has_prefix(str + i, ".function"))) {
kernel/trace/trace_events_hist.c: if ((len = str_has_prefix(str, "key=")) ||
kernel/trace/trace_events_hist.c: (len = str_has_prefix(str, "keys="))) {
kernel/trace/trace_events_hist.c: } else if ((len = str_has_prefix(str, "val=")) ||
kernel/trace/trace_events_hist.c: (len = str_has_prefix(str, "vals=")) ||
kernel/trace/trace_events_hist.c: (len = str_has_prefix(str, "values="))) {
kernel/trace/trace_events_hist.c: } else if ((len = str_has_prefix(str, "sort="))) {
kernel/trace/trace_events_hist.c: } else if ((len = str_has_prefix(str, "clock="))) {
kernel/trace/trace_events_hist.c: } else if ((len = str_has_prefix(str, "size="))) {
kernel/trace/trace_events_hist.c: if ((len = str_has_prefix(str, "onmatch(")))
kernel/trace/trace_events_hist.c: else if ((len = str_has_prefix(str, "onmax(")))
kernel/trace/trace_events_hist.c: else if ((len = str_has_prefix(str, "onchange(")))
kernel/trace/trace_stack.c: if ((len = str_has_prefix(str, "_filter=")))
It's fine being in the if statement as the if is more about "does this have
this prefix" and the length is just a side effect of it to use it to
extract the rest.
This patch is only about removing strncpy(), it doesn't need to modify the
format.
-- Steve
On Fri, 4 Apr 2025 at 23:49, Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Fri, 4 Apr 2025 19:28:48 +0530
> Devaansh Kumar <devaanshk840@gmail.com> wrote:
>
> > --- a/kernel/trace/trace_stack.c
> > +++ b/kernel/trace/trace_stack.c
> > @@ -543,8 +543,10 @@ static __init int enable_stacktrace(char *str)
> > {
> > int len;
> >
> > - if ((len = str_has_prefix(str, "_filter=")))
> > - strncpy(stack_trace_filter_buf, str + len, COMMAND_LINE_SIZE);
> > + len = str_has_prefix(str, "_filter=");
> > +
> > + if (len)
> > + strscpy(stack_trace_filter_buf, str + len, sizeof(stack_trace_filter_buf));
> >
> > stack_tracer_enabled = 1;
> > return 1;
>
> BTW, why separate out the len? I use this notation quite a bit for
> str_has_prefix() checks.
>
> $ git grep '(len = str_has_pref' kernel/trace
> kernel/trace/trace_events.c: if (!(len = str_has_prefix(fmt, "REC->")))
> kernel/trace/trace_events_filter.c: if ((len = str_has_prefix(str + i, ".ustring"))) {
> kernel/trace/trace_events_filter.c: if ((len = str_has_prefix(str + i, ".function"))) {
> kernel/trace/trace_events_hist.c: if ((len = str_has_prefix(str, "key=")) ||
> kernel/trace/trace_events_hist.c: (len = str_has_prefix(str, "keys="))) {
> kernel/trace/trace_events_hist.c: } else if ((len = str_has_prefix(str, "val=")) ||
> kernel/trace/trace_events_hist.c: (len = str_has_prefix(str, "vals=")) ||
> kernel/trace/trace_events_hist.c: (len = str_has_prefix(str, "values="))) {
> kernel/trace/trace_events_hist.c: } else if ((len = str_has_prefix(str, "sort="))) {
> kernel/trace/trace_events_hist.c: } else if ((len = str_has_prefix(str, "clock="))) {
> kernel/trace/trace_events_hist.c: } else if ((len = str_has_prefix(str, "size="))) {
> kernel/trace/trace_events_hist.c: if ((len = str_has_prefix(str, "onmatch(")))
> kernel/trace/trace_events_hist.c: else if ((len = str_has_prefix(str, "onmax(")))
> kernel/trace/trace_events_hist.c: else if ((len = str_has_prefix(str, "onchange(")))
> kernel/trace/trace_stack.c: if ((len = str_has_prefix(str, "_filter=")))
>
> It's fine being in the if statement as the if is more about "does this have
> this prefix" and the length is just a side effect of it to use it to
> extract the rest.
>
> This patch is only about removing strncpy(), it doesn't need to modify the
> format.
>
> -- Steve
Sure I'll keep that in mind.
-- Devaansh Kumar
© 2016 - 2026 Red Hat, Inc.