@@ -861,20 +861,20 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
861861 * FETCHARG:TYPE : use TYPE instead of unsigned long.
862862 */
863863 struct trace_kprobe * tk __free (free_trace_kprobe ) = NULL ;
864+ const char * event = NULL , * group = KPROBE_EVENT_SYSTEM ;
865+ const char * * new_argv __free (kfree ) = NULL ;
864866 int i , len , new_argc = 0 , ret = 0 ;
865- bool is_return = false;
866867 char * symbol __free (kfree ) = NULL ;
867- char * tmp = NULL ;
868- const char * * new_argv __free (kfree ) = NULL ;
869- const char * event = NULL , * group = KPROBE_EVENT_SYSTEM ;
868+ char * ebuf __free (kfree ) = NULL ;
869+ char * gbuf __free (kfree ) = NULL ;
870+ char * abuf __free (kfree ) = NULL ;
871+ char * dbuf __free (kfree ) = NULL ;
870872 enum probe_print_type ptype ;
873+ bool is_return = false;
871874 int maxactive = 0 ;
872- long offset = 0 ;
873875 void * addr = NULL ;
874- char buf [MAX_EVENT_NAME_LEN ];
875- char gbuf [MAX_EVENT_NAME_LEN ];
876- char abuf [MAX_BTF_ARGS_LEN ];
877- char * dbuf __free (kfree ) = NULL ;
876+ char * tmp = NULL ;
877+ long offset = 0 ;
878878
879879 switch (argv [0 ][0 ]) {
880880 case 'r' :
@@ -893,6 +893,8 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
893893 event ++ ;
894894
895895 if (isdigit (argv [0 ][1 ])) {
896+ char * buf __free (kfree ) = NULL ;
897+
896898 if (!is_return ) {
897899 trace_probe_log_err (1 , BAD_MAXACT_TYPE );
898900 return - EINVAL ;
@@ -905,7 +907,7 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
905907 trace_probe_log_err (1 , BAD_MAXACT );
906908 return - EINVAL ;
907909 }
908- memcpy ( buf , & argv [0 ][1 ], len );
910+ buf = kmemdup ( & argv [0 ][1 ], len + 1 , GFP_KERNEL );
909911 buf [len ] = '\0' ;
910912 ret = kstrtouint (buf , 0 , & maxactive );
911913 if (ret || !maxactive ) {
@@ -973,6 +975,9 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
973975
974976 trace_probe_log_set_index (0 );
975977 if (event ) {
978+ gbuf = kmalloc (MAX_EVENT_NAME_LEN , GFP_KERNEL );
979+ if (!gbuf )
980+ return - ENOMEM ;
976981 ret = traceprobe_parse_event_name (& event , & group , gbuf ,
977982 event - argv [0 ]);
978983 if (ret )
@@ -981,16 +986,22 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
981986
982987 if (!event ) {
983988 /* Make a new event name */
989+ ebuf = kmalloc (MAX_EVENT_NAME_LEN , GFP_KERNEL );
990+ if (!ebuf )
991+ return - ENOMEM ;
984992 if (symbol )
985- snprintf (buf , MAX_EVENT_NAME_LEN , "%c_%s_%ld" ,
993+ snprintf (ebuf , MAX_EVENT_NAME_LEN , "%c_%s_%ld" ,
986994 is_return ? 'r' : 'p' , symbol , offset );
987995 else
988- snprintf (buf , MAX_EVENT_NAME_LEN , "%c_0x%p" ,
996+ snprintf (ebuf , MAX_EVENT_NAME_LEN , "%c_0x%p" ,
989997 is_return ? 'r' : 'p' , addr );
990- sanitize_event_name (buf );
991- event = buf ;
998+ sanitize_event_name (ebuf );
999+ event = ebuf ;
9921000 }
9931001
1002+ abuf = kmalloc (MAX_BTF_ARGS_LEN , GFP_KERNEL );
1003+ if (!abuf )
1004+ return - ENOMEM ;
9941005 argc -= 2 ; argv += 2 ;
9951006 ctx -> funcname = symbol ;
9961007 new_argv = traceprobe_expand_meta_args (argc , argv , & new_argc ,
0 commit comments