Skip to content

Commit d643eaa

Browse files
committed
tracing: fprobe-event: Allocate string buffers from heap
Allocate temporary string buffers for fprobe-event from heap instead of stack. This fixes the stack frame exceed limit error. Link: https://lore.kernel.org/all/175323426643.57270.6657152008331160704.stgit@devnote2/ Reported-by: kernel test robot <[email protected]> Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/ Signed-off-by: Masami Hiramatsu (Google) <[email protected]> Reviewed-by: Steven Rostedt (Google) <[email protected]>
1 parent 43beb5e commit d643eaa

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

kernel/trace/trace_fprobe.c

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,18 +1235,18 @@ static int trace_fprobe_create_internal(int argc, const char *argv[],
12351235
* FETCHARG:TYPE : use TYPE instead of unsigned long.
12361236
*/
12371237
struct trace_fprobe *tf __free(free_trace_fprobe) = NULL;
1238-
struct module *mod __free(module_put) = NULL;
1239-
int i, new_argc = 0, ret = 0;
1240-
bool is_return = false;
1241-
char *symbol __free(kfree) = NULL;
12421238
const char *event = NULL, *group = FPROBE_EVENT_SYSTEM;
1239+
struct module *mod __free(module_put) = NULL;
12431240
const char **new_argv __free(kfree) = NULL;
1244-
char buf[MAX_EVENT_NAME_LEN];
1245-
char gbuf[MAX_EVENT_NAME_LEN];
1246-
char sbuf[KSYM_NAME_LEN];
1247-
char abuf[MAX_BTF_ARGS_LEN];
1241+
char *symbol __free(kfree) = NULL;
1242+
char *ebuf __free(kfree) = NULL;
1243+
char *gbuf __free(kfree) = NULL;
1244+
char *sbuf __free(kfree) = NULL;
1245+
char *abuf __free(kfree) = NULL;
12481246
char *dbuf __free(kfree) = NULL;
1247+
int i, new_argc = 0, ret = 0;
12491248
bool is_tracepoint = false;
1249+
bool is_return = false;
12501250

12511251
if ((argv[0][0] != 'f' && argv[0][0] != 't') || argc < 2)
12521252
return -ECANCELED;
@@ -1274,22 +1274,28 @@ static int trace_fprobe_create_internal(int argc, const char *argv[],
12741274

12751275
trace_probe_log_set_index(0);
12761276
if (event) {
1277+
gbuf = kmalloc(MAX_EVENT_NAME_LEN, GFP_KERNEL);
1278+
if (!gbuf)
1279+
return -ENOMEM;
12771280
ret = traceprobe_parse_event_name(&event, &group, gbuf,
12781281
event - argv[0]);
12791282
if (ret)
12801283
return -EINVAL;
12811284
}
12821285

12831286
if (!event) {
1287+
ebuf = kmalloc(MAX_EVENT_NAME_LEN, GFP_KERNEL);
1288+
if (!ebuf)
1289+
return -ENOMEM;
12841290
/* Make a new event name */
12851291
if (is_tracepoint)
1286-
snprintf(buf, MAX_EVENT_NAME_LEN, "%s%s",
1292+
snprintf(ebuf, MAX_EVENT_NAME_LEN, "%s%s",
12871293
isdigit(*symbol) ? "_" : "", symbol);
12881294
else
1289-
snprintf(buf, MAX_EVENT_NAME_LEN, "%s__%s", symbol,
1295+
snprintf(ebuf, MAX_EVENT_NAME_LEN, "%s__%s", symbol,
12901296
is_return ? "exit" : "entry");
1291-
sanitize_event_name(buf);
1292-
event = buf;
1297+
sanitize_event_name(ebuf);
1298+
event = ebuf;
12931299
}
12941300

12951301
if (is_return)
@@ -1305,13 +1311,20 @@ static int trace_fprobe_create_internal(int argc, const char *argv[],
13051311
ctx->flags |= TPARG_FL_TPOINT;
13061312
mod = NULL;
13071313
tpoint = find_tracepoint(symbol, &mod);
1308-
if (tpoint)
1314+
if (tpoint) {
1315+
sbuf = kmalloc(KSYM_NAME_LEN, GFP_KERNEL);
1316+
if (!sbuf)
1317+
return -ENOMEM;
13091318
ctx->funcname = kallsyms_lookup((unsigned long)tpoint->probestub,
13101319
NULL, NULL, NULL, sbuf);
1320+
}
13111321
}
13121322
if (!ctx->funcname)
13131323
ctx->funcname = symbol;
13141324

1325+
abuf = kmalloc(MAX_BTF_ARGS_LEN, GFP_KERNEL);
1326+
if (!abuf)
1327+
return -ENOMEM;
13151328
argc -= 2; argv += 2;
13161329
new_argv = traceprobe_expand_meta_args(argc, argv, &new_argc,
13171330
abuf, MAX_BTF_ARGS_LEN, ctx);

0 commit comments

Comments
 (0)