tracing: uprobe-event: Allocate string buffers from heap
Allocate temporary string buffers for parsing uprobe-events from heap instead of stack. Link: https://lore.kernel.org/all/175323429593.57270.12369235525923902341.stgit@devnote2/ Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#define pr_fmt(fmt) "trace_uprobe: " fmt
|
||||
|
||||
#include <linux/bpf-cgroup.h>
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/filter.h>
|
||||
#include <linux/module.h>
|
||||
@@ -19,6 +20,7 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/uprobes.h>
|
||||
|
||||
#include "trace.h"
|
||||
#include "trace_dynevent.h"
|
||||
#include "trace_probe.h"
|
||||
#include "trace_probe_tmpl.h"
|
||||
@@ -537,15 +539,15 @@ static int register_trace_uprobe(struct trace_uprobe *tu)
|
||||
*/
|
||||
static int __trace_uprobe_create(int argc, const char **argv)
|
||||
{
|
||||
struct trace_uprobe *tu;
|
||||
const char *event = NULL, *group = UPROBE_EVENT_SYSTEM;
|
||||
char *arg, *filename, *rctr, *rctr_end, *tmp;
|
||||
char buf[MAX_EVENT_NAME_LEN];
|
||||
char gbuf[MAX_EVENT_NAME_LEN];
|
||||
enum probe_print_type ptype;
|
||||
struct path path;
|
||||
unsigned long offset, ref_ctr_offset;
|
||||
char *gbuf __free(kfree) = NULL;
|
||||
char *buf __free(kfree) = NULL;
|
||||
enum probe_print_type ptype;
|
||||
struct trace_uprobe *tu;
|
||||
bool is_return = false;
|
||||
struct path path;
|
||||
int i, ret;
|
||||
|
||||
ref_ctr_offset = 0;
|
||||
@@ -653,6 +655,10 @@ static int __trace_uprobe_create(int argc, const char **argv)
|
||||
/* setup a probe */
|
||||
trace_probe_log_set_index(0);
|
||||
if (event) {
|
||||
gbuf = kmalloc(MAX_EVENT_NAME_LEN, GFP_KERNEL);
|
||||
if (!gbuf)
|
||||
goto fail_mem;
|
||||
|
||||
ret = traceprobe_parse_event_name(&event, &group, gbuf,
|
||||
event - argv[0]);
|
||||
if (ret)
|
||||
@@ -664,15 +670,16 @@ static int __trace_uprobe_create(int argc, const char **argv)
|
||||
char *ptr;
|
||||
|
||||
tail = kstrdup(kbasename(filename), GFP_KERNEL);
|
||||
if (!tail) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_address_parse;
|
||||
}
|
||||
if (!tail)
|
||||
goto fail_mem;
|
||||
|
||||
ptr = strpbrk(tail, ".-_");
|
||||
if (ptr)
|
||||
*ptr = '\0';
|
||||
|
||||
buf = kmalloc(MAX_EVENT_NAME_LEN, GFP_KERNEL);
|
||||
if (!buf)
|
||||
goto fail_mem;
|
||||
snprintf(buf, MAX_EVENT_NAME_LEN, "%c_%s_0x%lx", 'p', tail, offset);
|
||||
event = buf;
|
||||
kfree(tail);
|
||||
@@ -724,6 +731,9 @@ out:
|
||||
trace_probe_log_clear();
|
||||
return ret;
|
||||
|
||||
fail_mem:
|
||||
ret = -ENOMEM;
|
||||
|
||||
fail_address_parse:
|
||||
trace_probe_log_clear();
|
||||
path_put(&path);
|
||||
|
||||
Reference in New Issue
Block a user