Skip to content

Commit 33b4e38

Browse files
committed
tracing: kprobe-event: Allocate string buffers from heap
Allocate temporary string buffers for parsing kprobe-events from heap instead of stack. Link: https://lore.kernel.org/all/175323427627.57270.5105357260879695051.stgit@devnote2/ Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org>
1 parent d643eaa commit 33b4e38

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

kernel/trace/trace_kprobe.c

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)