mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-08 21:33:55 +08:00
This adds three fixes for the tracing code.
The first is a bug when ftrace_dump_on_oops is triggered in atomic context and function graph tracer is the tracer that is being reported. The second fix is bad parsing of the trace_events from the kernel command line, where it would ignore specific events if the system name is used with defining the event(it enables all events within the system). The last one is a fix to the TRACE_DEFINE_ENUM(), where a check was missing to see if the ptr was incremented to the end of the string, but the loop increments it again and can miss the nul delimiter to stop processing. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJVN7g7AAoJEEjnJuOKh9ldLCkIAJj6wsj59wR8aIxtxnD5bJZZ Y9dKkas6BOaUCGp0MVBCkpm3uMgh0uPO10jOuthgc3LgQy0piwKJrIzGkI5gcRuA JvZw2X08/jCSNu8BHydes2A0XMkZobMuWFAeWz3CSzNBfbI3sDDqgnRQ9eyMM66R +sPV7ZELQLK/ZFs93gFoaZe/OKGYJcamhMtG2v7p9h1qBJZUDakRFo478bAwu5SB Kh6xpXA76WnmkeQekAAsWGdqIQzoNy3IoVePmdhVpZvoiKLUrf1JWVYFoNkO39Ik kC1gqJro0EmHQFOo5rt8yQmqXjvSU0sS/sAW3HZ0Szl5OtiUNnag+Wt3ku7lr8U= =VORa -----END PGP SIGNATURE----- Merge tag 'trace-v4.1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace Pull tracing fixes from Steven Rostedt: "This adds three fixes for the tracing code. The first is a bug when ftrace_dump_on_oops is triggered in atomic context and function graph tracer is the tracer that is being reported. The second fix is bad parsing of the trace_events from the kernel command line, where it would ignore specific events if the system name is used with defining the event(it enables all events within the system). The last one is a fix to the TRACE_DEFINE_ENUM(), where a check was missing to see if the ptr was incremented to the end of the string, but the loop increments it again and can miss the nul delimiter to stop processing" * tag 'trace-v4.1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: tracing: Fix possible out of bounds memory access when parsing enums tracing: Fix incorrect enabling of trace events by boot cmdline tracing: Handle ftrace_dump() atomic context in graph_trace_open()
This commit is contained in:
commit
4f2112351b
@ -565,6 +565,7 @@ static int __ftrace_set_clr_event(struct trace_array *tr, const char *match,
|
|||||||
static int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set)
|
static int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set)
|
||||||
{
|
{
|
||||||
char *event = NULL, *sub = NULL, *match;
|
char *event = NULL, *sub = NULL, *match;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The buf format can be <subsystem>:<event-name>
|
* The buf format can be <subsystem>:<event-name>
|
||||||
@ -590,7 +591,13 @@ static int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set)
|
|||||||
event = NULL;
|
event = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return __ftrace_set_clr_event(tr, match, sub, event, set);
|
ret = __ftrace_set_clr_event(tr, match, sub, event, set);
|
||||||
|
|
||||||
|
/* Put back the colon to allow this to be called again */
|
||||||
|
if (buf)
|
||||||
|
*(buf - 1) = ':';
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1753,6 +1760,8 @@ static void update_event_printk(struct ftrace_event_call *call,
|
|||||||
ptr++;
|
ptr++;
|
||||||
/* Check for alpha chars like ULL */
|
/* Check for alpha chars like ULL */
|
||||||
} while (isalnum(*ptr));
|
} while (isalnum(*ptr));
|
||||||
|
if (!*ptr)
|
||||||
|
break;
|
||||||
/*
|
/*
|
||||||
* A number must have some kind of delimiter after
|
* A number must have some kind of delimiter after
|
||||||
* it, and we can ignore that too.
|
* it, and we can ignore that too.
|
||||||
@ -1779,12 +1788,16 @@ static void update_event_printk(struct ftrace_event_call *call,
|
|||||||
do {
|
do {
|
||||||
ptr++;
|
ptr++;
|
||||||
} while (isalnum(*ptr) || *ptr == '_');
|
} while (isalnum(*ptr) || *ptr == '_');
|
||||||
|
if (!*ptr)
|
||||||
|
break;
|
||||||
/*
|
/*
|
||||||
* If what comes after this variable is a '.' or
|
* If what comes after this variable is a '.' or
|
||||||
* '->' then we can continue to ignore that string.
|
* '->' then we can continue to ignore that string.
|
||||||
*/
|
*/
|
||||||
if (*ptr == '.' || (ptr[0] == '-' && ptr[1] == '>')) {
|
if (*ptr == '.' || (ptr[0] == '-' && ptr[1] == '>')) {
|
||||||
ptr += *ptr == '.' ? 1 : 2;
|
ptr += *ptr == '.' ? 1 : 2;
|
||||||
|
if (!*ptr)
|
||||||
|
break;
|
||||||
goto skip_more;
|
goto skip_more;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -1308,15 +1308,19 @@ void graph_trace_open(struct trace_iterator *iter)
|
|||||||
{
|
{
|
||||||
/* pid and depth on the last trace processed */
|
/* pid and depth on the last trace processed */
|
||||||
struct fgraph_data *data;
|
struct fgraph_data *data;
|
||||||
|
gfp_t gfpflags;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
iter->private = NULL;
|
iter->private = NULL;
|
||||||
|
|
||||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
/* We can be called in atomic context via ftrace_dump() */
|
||||||
|
gfpflags = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL;
|
||||||
|
|
||||||
|
data = kzalloc(sizeof(*data), gfpflags);
|
||||||
if (!data)
|
if (!data)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
data->cpu_data = alloc_percpu(struct fgraph_cpu_data);
|
data->cpu_data = alloc_percpu_gfp(struct fgraph_cpu_data, gfpflags);
|
||||||
if (!data->cpu_data)
|
if (!data->cpu_data)
|
||||||
goto out_err_free;
|
goto out_err_free;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user