diff mbox series

[v2] tracing/eprobe: Replace snprintf with memcpy

Message ID 20230109033213.3220884-1-quanfafu@gmail.com (mailing list archive)
State Changes Requested
Headers show
Series [v2] tracing/eprobe: Replace snprintf with memcpy | expand

Commit Message

Quanfa Fu Jan. 9, 2023, 3:32 a.m. UTC
No need to check for negative return value from snprintf() as the
code does not return negative values. Replace snprintf with memcpy.

Signed-off-by: Quanfa Fu <quanfafu@gmail.com>

-----
V1 -> V2: memory allc uses kzalloc and replace snprintf with memcpy
---
 kernel/trace/trace_eprobe.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

Comments

Steven Rostedt Jan. 9, 2023, 3:52 a.m. UTC | #1
On Mon,  9 Jan 2023 11:32:13 +0800
Quanfa Fu <quanfafu@gmail.com> wrote:

> @@ -923,17 +923,17 @@ static int trace_eprobe_parse_filter(struct trace_eprobe *ep, int argc, const ch
>  
>  	p = ep->filter_str;
>  	for (i = 0; i < argc; i++) {
> -		ret = snprintf(p, len, "%s ", argv[i]);
> -		if (ret < 0)
> -			goto error;
> -		if (ret > len) {
> -			ret = -E2BIG;
> -			goto error;
> -		}
> -		p += ret;
> -		len -= ret;
> +		arg_len = strlen(argv[i]);
> +		memcpy((void *)p, argv[i], arg_len);
> +
> +		if (i == argc - 1)
> +			p[arg_len] = '\0';
> +		else
> +			p[arg_len] = ' ';
> +
> +		p += arg_len + 1;
> +		len -= arg_len + 1;
>  	}

The above is too complex. I mentioned strncat() but you could still
just keep snprintf() too, which adds the '\0';

	for (i = 0; i < argc; i++) {
		if (i)
			ret = snprintf(p, len, " %s", argv[i]);
		else
			ret = snprintf(p, len, "%s", argv[i]);
		p += ret;
		len -= ret;
	}

-- Steve

> -	p[-1] = '\0';
>  
>  	/*
>  	 * Ensure the filter string can be parsed correctly. Note, this
Quanfa Fu Jan. 9, 2023, 4:07 a.m. UTC | #2
Thanks, I'll check it out.
Thanks !!

On Mon, Jan 9, 2023 at 11:52 AM Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Mon,  9 Jan 2023 11:32:13 +0800
> Quanfa Fu <quanfafu@gmail.com> wrote:
>
> > @@ -923,17 +923,17 @@ static int trace_eprobe_parse_filter(struct trace_eprobe *ep, int argc, const ch
> >
> >       p = ep->filter_str;
> >       for (i = 0; i < argc; i++) {
> > -             ret = snprintf(p, len, "%s ", argv[i]);
> > -             if (ret < 0)
> > -                     goto error;
> > -             if (ret > len) {
> > -                     ret = -E2BIG;
> > -                     goto error;
> > -             }
> > -             p += ret;
> > -             len -= ret;
> > +             arg_len = strlen(argv[i]);
> > +             memcpy((void *)p, argv[i], arg_len);
> > +
> > +             if (i == argc - 1)
> > +                     p[arg_len] = '\0';
> > +             else
> > +                     p[arg_len] = ' ';
> > +
> > +             p += arg_len + 1;
> > +             len -= arg_len + 1;
> >       }
>
> The above is too complex. I mentioned strncat() but you could still
> just keep snprintf() too, which adds the '\0';
>
>         for (i = 0; i < argc; i++) {
>                 if (i)
>                         ret = snprintf(p, len, " %s", argv[i]);
>                 else
>                         ret = snprintf(p, len, "%s", argv[i]);
>                 p += ret;
>                 len -= ret;
>         }
>
> -- Steve
>
> > -     p[-1] = '\0';
> >
> >       /*
> >        * Ensure the filter string can be parsed correctly. Note, this
diff mbox series

Patch

diff --git a/kernel/trace/trace_eprobe.c b/kernel/trace/trace_eprobe.c
index 352b65e2b910..56eb39f495f6 100644
--- a/kernel/trace/trace_eprobe.c
+++ b/kernel/trace/trace_eprobe.c
@@ -905,7 +905,7 @@  static int trace_eprobe_tp_update_arg(struct trace_eprobe *ep, const char *argv[
 static int trace_eprobe_parse_filter(struct trace_eprobe *ep, int argc, const char *argv[])
 {
 	struct event_filter *dummy = NULL;
-	int i, ret, len = 0;
+	int i, ret, arg_len, len = 0;
 	char *p;
 
 	if (argc == 0) {
@@ -923,17 +923,17 @@  static int trace_eprobe_parse_filter(struct trace_eprobe *ep, int argc, const ch
 
 	p = ep->filter_str;
 	for (i = 0; i < argc; i++) {
-		ret = snprintf(p, len, "%s ", argv[i]);
-		if (ret < 0)
-			goto error;
-		if (ret > len) {
-			ret = -E2BIG;
-			goto error;
-		}
-		p += ret;
-		len -= ret;
+		arg_len = strlen(argv[i]);
+		memcpy((void *)p, argv[i], arg_len);
+
+		if (i == argc - 1)
+			p[arg_len] = '\0';
+		else
+			p[arg_len] = ' ';
+
+		p += arg_len + 1;
+		len -= arg_len + 1;
 	}
-	p[-1] = '\0';
 
 	/*
 	 * Ensure the filter string can be parsed correctly. Note, this