A few more tracing fixes:
- Fixed a buffer overflow by checking nr_args correctly in probes - Fixed a warning that is reported by clang - Fixed a possible memory leak in error path of filter processing - Fixed the selftest that checks for failures, but wasn't failing - Minor clean up on call site output of a memory trace event -----BEGIN PGP SIGNATURE----- iIoEABYIADIWIQRRSw7ePDh/lE+zeZMp5XQQmuv6qgUCXZEP5hQccm9zdGVkdEBn b29kbWlzLm9yZwAKCRAp5XQQmuv6qhrSAQDlws8rY/vJN4tKL1YaBTRyS5OW+1B+ LPLOxm9PBuzt0wEArVunv7iMgvRzp5spbmCqmD8Is2vSf+45KSrb10WU2wo= =L37R -----END PGP SIGNATURE----- Merge tag 'trace-v5.4-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace Pull tracing fixes from Steven Rostedt: "A few more tracing fixes: - Fix a buffer overflow by checking nr_args correctly in probes - Fix a warning that is reported by clang - Fix a possible memory leak in error path of filter processing - Fix the selftest that checks for failures, but wasn't failing - Minor clean up on call site output of a memory trace event" * tag 'trace-v5.4-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: selftests/ftrace: Fix same probe error test mm, tracing: Print symbol name for call_site in trace events tracing: Have error path in predicate_parse() free its allocated memory tracing: Fix clang -Wint-in-bool-context warnings in IF_ASSIGN macro tracing/probe: Fix to check the difference of nr_args before adding probe
This commit is contained in:
Коммит
cf4f493b10
|
@ -35,8 +35,8 @@ DECLARE_EVENT_CLASS(kmem_alloc,
|
|||
__entry->gfp_flags = gfp_flags;
|
||||
),
|
||||
|
||||
TP_printk("call_site=%lx ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s",
|
||||
__entry->call_site,
|
||||
TP_printk("call_site=%pS ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s",
|
||||
(void *)__entry->call_site,
|
||||
__entry->ptr,
|
||||
__entry->bytes_req,
|
||||
__entry->bytes_alloc,
|
||||
|
@ -131,7 +131,8 @@ DECLARE_EVENT_CLASS(kmem_free,
|
|||
__entry->ptr = ptr;
|
||||
),
|
||||
|
||||
TP_printk("call_site=%lx ptr=%p", __entry->call_site, __entry->ptr)
|
||||
TP_printk("call_site=%pS ptr=%p",
|
||||
(void *)__entry->call_site, __entry->ptr)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(kmem_free, kfree,
|
||||
|
|
|
@ -365,11 +365,11 @@ static inline struct trace_array *top_trace_array(void)
|
|||
__builtin_types_compatible_p(typeof(var), type *)
|
||||
|
||||
#undef IF_ASSIGN
|
||||
#define IF_ASSIGN(var, entry, etype, id) \
|
||||
if (FTRACE_CMP_TYPE(var, etype)) { \
|
||||
var = (typeof(var))(entry); \
|
||||
WARN_ON(id && (entry)->type != id); \
|
||||
break; \
|
||||
#define IF_ASSIGN(var, entry, etype, id) \
|
||||
if (FTRACE_CMP_TYPE(var, etype)) { \
|
||||
var = (typeof(var))(entry); \
|
||||
WARN_ON(id != 0 && (entry)->type != id); \
|
||||
break; \
|
||||
}
|
||||
|
||||
/* Will cause compile errors if type is not found. */
|
||||
|
|
|
@ -452,8 +452,10 @@ predicate_parse(const char *str, int nr_parens, int nr_preds,
|
|||
|
||||
switch (*next) {
|
||||
case '(': /* #2 */
|
||||
if (top - op_stack > nr_parens)
|
||||
return ERR_PTR(-EINVAL);
|
||||
if (top - op_stack > nr_parens) {
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
*(++top) = invert;
|
||||
continue;
|
||||
case '!': /* #3 */
|
||||
|
|
|
@ -178,6 +178,16 @@ void __trace_probe_log_err(int offset, int err_type)
|
|||
if (!command)
|
||||
return;
|
||||
|
||||
if (trace_probe_log.index >= trace_probe_log.argc) {
|
||||
/**
|
||||
* Set the error position is next to the last arg + space.
|
||||
* Note that len includes the terminal null and the cursor
|
||||
* appaers at pos + 1.
|
||||
*/
|
||||
pos = len;
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
/* And make a command string from argv array */
|
||||
p = command;
|
||||
for (i = 0; i < trace_probe_log.argc; i++) {
|
||||
|
@ -1084,6 +1094,12 @@ int trace_probe_compare_arg_type(struct trace_probe *a, struct trace_probe *b)
|
|||
{
|
||||
int i;
|
||||
|
||||
/* In case of more arguments */
|
||||
if (a->nr_args < b->nr_args)
|
||||
return a->nr_args + 1;
|
||||
if (a->nr_args > b->nr_args)
|
||||
return b->nr_args + 1;
|
||||
|
||||
for (i = 0; i < a->nr_args; i++) {
|
||||
if ((b->nr_args <= i) ||
|
||||
((a->args[i].type != b->args[i].type) ||
|
||||
|
|
|
@ -95,7 +95,7 @@ echo 'p:kprobes/testevent _do_fork abcd=\1' > kprobe_events
|
|||
check_error 'p:kprobes/testevent _do_fork ^bcd=\1' # DIFF_ARG_TYPE
|
||||
check_error 'p:kprobes/testevent _do_fork ^abcd=\1:u8' # DIFF_ARG_TYPE
|
||||
check_error 'p:kprobes/testevent _do_fork ^abcd=\"foo"' # DIFF_ARG_TYPE
|
||||
check_error '^p:kprobes/testevent _do_fork' # SAME_PROBE
|
||||
check_error '^p:kprobes/testevent _do_fork abcd=\1' # SAME_PROBE
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
Загрузка…
Ссылка в новой задаче