@@ -861,20 +861,20 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
861
861
* FETCHARG:TYPE : use TYPE instead of unsigned long.
862
862
*/
863
863
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 ;
864
866
int i , len , new_argc = 0 , ret = 0 ;
865
- bool is_return = false;
866
867
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 ;
870
872
enum probe_print_type ptype ;
873
+ bool is_return = false;
871
874
int maxactive = 0 ;
872
- long offset = 0 ;
873
875
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 ;
878
878
879
879
switch (argv [0 ][0 ]) {
880
880
case 'r' :
@@ -893,6 +893,8 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
893
893
event ++ ;
894
894
895
895
if (isdigit (argv [0 ][1 ])) {
896
+ char * buf __free (kfree ) = NULL ;
897
+
896
898
if (!is_return ) {
897
899
trace_probe_log_err (1 , BAD_MAXACT_TYPE );
898
900
return - EINVAL ;
@@ -905,7 +907,7 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
905
907
trace_probe_log_err (1 , BAD_MAXACT );
906
908
return - EINVAL ;
907
909
}
908
- memcpy ( buf , & argv [0 ][1 ], len );
910
+ buf = kmemdup ( & argv [0 ][1 ], len + 1 , GFP_KERNEL );
909
911
buf [len ] = '\0' ;
910
912
ret = kstrtouint (buf , 0 , & maxactive );
911
913
if (ret || !maxactive ) {
@@ -973,6 +975,9 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
973
975
974
976
trace_probe_log_set_index (0 );
975
977
if (event ) {
978
+ gbuf = kmalloc (MAX_EVENT_NAME_LEN , GFP_KERNEL );
979
+ if (!gbuf )
980
+ return - ENOMEM ;
976
981
ret = traceprobe_parse_event_name (& event , & group , gbuf ,
977
982
event - argv [0 ]);
978
983
if (ret )
@@ -981,16 +986,22 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
981
986
982
987
if (!event ) {
983
988
/* Make a new event name */
989
+ ebuf = kmalloc (MAX_EVENT_NAME_LEN , GFP_KERNEL );
990
+ if (!ebuf )
991
+ return - ENOMEM ;
984
992
if (symbol )
985
- snprintf (buf , MAX_EVENT_NAME_LEN , "%c_%s_%ld" ,
993
+ snprintf (ebuf , MAX_EVENT_NAME_LEN , "%c_%s_%ld" ,
986
994
is_return ? 'r' : 'p' , symbol , offset );
987
995
else
988
- snprintf (buf , MAX_EVENT_NAME_LEN , "%c_0x%p" ,
996
+ snprintf (ebuf , MAX_EVENT_NAME_LEN , "%c_0x%p" ,
989
997
is_return ? 'r' : 'p' , addr );
990
- sanitize_event_name (buf );
991
- event = buf ;
998
+ sanitize_event_name (ebuf );
999
+ event = ebuf ;
992
1000
}
993
1001
1002
+ abuf = kmalloc (MAX_BTF_ARGS_LEN , GFP_KERNEL );
1003
+ if (!abuf )
1004
+ return - ENOMEM ;
994
1005
argc -= 2 ; argv += 2 ;
995
1006
ctx -> funcname = symbol ;
996
1007
new_argv = traceprobe_expand_meta_args (argc , argv , & new_argc ,
0 commit comments