tools lib traceevent: Remove some die() calls
Cleaned event-parse.c this time, just propagate the errors and in handle them the call sites. Reviewed-by: Namhyung Kim <namhyung@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/n/tip-9ebpr2vgfk2qs2841i99sa8y@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
b85119200d
commit
a6d2a61ac6
@ -31,6 +31,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
#include "event-parse.h"
|
#include "event-parse.h"
|
||||||
#include "event-utils.h"
|
#include "event-utils.h"
|
||||||
@ -151,7 +152,9 @@ static int cmdline_init(struct pevent *pevent)
|
|||||||
struct cmdline *cmdlines;
|
struct cmdline *cmdlines;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cmdlines = malloc_or_die(sizeof(*cmdlines) * pevent->cmdline_count);
|
cmdlines = malloc(sizeof(*cmdlines) * pevent->cmdline_count);
|
||||||
|
if (!cmdlines)
|
||||||
|
return -1;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while (cmdlist) {
|
while (cmdlist) {
|
||||||
@ -179,8 +182,8 @@ static char *find_cmdline(struct pevent *pevent, int pid)
|
|||||||
if (!pid)
|
if (!pid)
|
||||||
return "<idle>";
|
return "<idle>";
|
||||||
|
|
||||||
if (!pevent->cmdlines)
|
if (!pevent->cmdlines && cmdline_init(pevent))
|
||||||
cmdline_init(pevent);
|
return "<not enough memory for cmdlines!>";
|
||||||
|
|
||||||
key.pid = pid;
|
key.pid = pid;
|
||||||
|
|
||||||
@ -208,8 +211,8 @@ int pevent_pid_is_registered(struct pevent *pevent, int pid)
|
|||||||
if (!pid)
|
if (!pid)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (!pevent->cmdlines)
|
if (!pevent->cmdlines && cmdline_init(pevent))
|
||||||
cmdline_init(pevent);
|
return 0;
|
||||||
|
|
||||||
key.pid = pid;
|
key.pid = pid;
|
||||||
|
|
||||||
@ -251,10 +254,14 @@ static int add_new_comm(struct pevent *pevent, const char *comm, int pid)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdlines[pevent->cmdline_count].pid = pid;
|
|
||||||
cmdlines[pevent->cmdline_count].comm = strdup(comm);
|
cmdlines[pevent->cmdline_count].comm = strdup(comm);
|
||||||
if (!cmdlines[pevent->cmdline_count].comm)
|
if (!cmdlines[pevent->cmdline_count].comm) {
|
||||||
die("malloc comm");
|
free(cmdlines);
|
||||||
|
errno = ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdlines[pevent->cmdline_count].pid = pid;
|
||||||
|
|
||||||
if (cmdlines[pevent->cmdline_count].comm)
|
if (cmdlines[pevent->cmdline_count].comm)
|
||||||
pevent->cmdline_count++;
|
pevent->cmdline_count++;
|
||||||
@ -281,10 +288,15 @@ int pevent_register_comm(struct pevent *pevent, const char *comm, int pid)
|
|||||||
if (pevent->cmdlines)
|
if (pevent->cmdlines)
|
||||||
return add_new_comm(pevent, comm, pid);
|
return add_new_comm(pevent, comm, pid);
|
||||||
|
|
||||||
item = malloc_or_die(sizeof(*item));
|
item = malloc(sizeof(*item));
|
||||||
|
if (!item)
|
||||||
|
return -1;
|
||||||
|
|
||||||
item->comm = strdup(comm);
|
item->comm = strdup(comm);
|
||||||
if (!item->comm)
|
if (!item->comm) {
|
||||||
die("malloc comm");
|
free(item);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
item->pid = pid;
|
item->pid = pid;
|
||||||
item->next = pevent->cmdlist;
|
item->next = pevent->cmdlist;
|
||||||
|
|
||||||
@ -348,7 +360,10 @@ static int func_map_init(struct pevent *pevent)
|
|||||||
struct func_map *func_map;
|
struct func_map *func_map;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
func_map = malloc_or_die(sizeof(*func_map) * (pevent->func_count + 1));
|
func_map = malloc(sizeof(*func_map) * (pevent->func_count + 1));
|
||||||
|
if (!func_map)
|
||||||
|
return -1;
|
||||||
|
|
||||||
funclist = pevent->funclist;
|
funclist = pevent->funclist;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
@ -448,25 +463,36 @@ pevent_find_function_address(struct pevent *pevent, unsigned long long addr)
|
|||||||
int pevent_register_function(struct pevent *pevent, char *func,
|
int pevent_register_function(struct pevent *pevent, char *func,
|
||||||
unsigned long long addr, char *mod)
|
unsigned long long addr, char *mod)
|
||||||
{
|
{
|
||||||
struct func_list *item;
|
struct func_list *item = malloc(sizeof(*item));
|
||||||
|
|
||||||
item = malloc_or_die(sizeof(*item));
|
if (!item)
|
||||||
|
return -1;
|
||||||
|
|
||||||
item->next = pevent->funclist;
|
item->next = pevent->funclist;
|
||||||
item->func = strdup(func);
|
item->func = strdup(func);
|
||||||
if (mod)
|
if (!item->func)
|
||||||
|
goto out_free;
|
||||||
|
|
||||||
|
if (mod) {
|
||||||
item->mod = strdup(mod);
|
item->mod = strdup(mod);
|
||||||
else
|
if (!item->mod)
|
||||||
|
goto out_free_func;
|
||||||
|
} else
|
||||||
item->mod = NULL;
|
item->mod = NULL;
|
||||||
item->addr = addr;
|
item->addr = addr;
|
||||||
|
|
||||||
if (!item->func || (mod && !item->mod))
|
|
||||||
die("malloc func");
|
|
||||||
|
|
||||||
pevent->funclist = item;
|
pevent->funclist = item;
|
||||||
pevent->func_count++;
|
pevent->func_count++;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_free_func:
|
||||||
|
free(item->func);
|
||||||
|
item->func = NULL;
|
||||||
|
out_free:
|
||||||
|
free(item);
|
||||||
|
errno = ENOMEM;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -517,14 +543,16 @@ static int printk_cmp(const void *a, const void *b)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printk_map_init(struct pevent *pevent)
|
static int printk_map_init(struct pevent *pevent)
|
||||||
{
|
{
|
||||||
struct printk_list *printklist;
|
struct printk_list *printklist;
|
||||||
struct printk_list *item;
|
struct printk_list *item;
|
||||||
struct printk_map *printk_map;
|
struct printk_map *printk_map;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
printk_map = malloc_or_die(sizeof(*printk_map) * (pevent->printk_count + 1));
|
printk_map = malloc(sizeof(*printk_map) * (pevent->printk_count + 1));
|
||||||
|
if (!printk_map)
|
||||||
|
return -1;
|
||||||
|
|
||||||
printklist = pevent->printklist;
|
printklist = pevent->printklist;
|
||||||
|
|
||||||
@ -542,6 +570,8 @@ static void printk_map_init(struct pevent *pevent)
|
|||||||
|
|
||||||
pevent->printk_map = printk_map;
|
pevent->printk_map = printk_map;
|
||||||
pevent->printklist = NULL;
|
pevent->printklist = NULL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct printk_map *
|
static struct printk_map *
|
||||||
@ -550,8 +580,8 @@ find_printk(struct pevent *pevent, unsigned long long addr)
|
|||||||
struct printk_map *printk;
|
struct printk_map *printk;
|
||||||
struct printk_map key;
|
struct printk_map key;
|
||||||
|
|
||||||
if (!pevent->printk_map)
|
if (!pevent->printk_map && printk_map_init(pevent))
|
||||||
printk_map_init(pevent);
|
return NULL;
|
||||||
|
|
||||||
key.addr = addr;
|
key.addr = addr;
|
||||||
|
|
||||||
@ -573,21 +603,27 @@ find_printk(struct pevent *pevent, unsigned long long addr)
|
|||||||
int pevent_register_print_string(struct pevent *pevent, char *fmt,
|
int pevent_register_print_string(struct pevent *pevent, char *fmt,
|
||||||
unsigned long long addr)
|
unsigned long long addr)
|
||||||
{
|
{
|
||||||
struct printk_list *item;
|
struct printk_list *item = malloc(sizeof(*item));
|
||||||
|
|
||||||
item = malloc_or_die(sizeof(*item));
|
if (!item)
|
||||||
|
return -1;
|
||||||
|
|
||||||
item->next = pevent->printklist;
|
item->next = pevent->printklist;
|
||||||
item->printk = strdup(fmt);
|
|
||||||
item->addr = addr;
|
item->addr = addr;
|
||||||
|
|
||||||
|
item->printk = strdup(fmt);
|
||||||
if (!item->printk)
|
if (!item->printk)
|
||||||
die("malloc fmt");
|
goto out_free;
|
||||||
|
|
||||||
pevent->printklist = item;
|
pevent->printklist = item;
|
||||||
pevent->printk_count++;
|
pevent->printk_count++;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_free:
|
||||||
|
free(item);
|
||||||
|
errno = ENOMEM;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -615,14 +651,15 @@ static struct event_format *alloc_event(void)
|
|||||||
return calloc(1, sizeof(struct event_format));
|
return calloc(1, sizeof(struct event_format));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_event(struct pevent *pevent, struct event_format *event)
|
static int add_event(struct pevent *pevent, struct event_format *event)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
struct event_format **events = realloc(pevent->events, sizeof(event) *
|
||||||
|
(pevent->nr_events + 1));
|
||||||
|
if (!events)
|
||||||
|
return -1;
|
||||||
|
|
||||||
pevent->events = realloc(pevent->events, sizeof(event) *
|
pevent->events = events;
|
||||||
(pevent->nr_events + 1));
|
|
||||||
if (!pevent->events)
|
|
||||||
die("Can not allocate events");
|
|
||||||
|
|
||||||
for (i = 0; i < pevent->nr_events; i++) {
|
for (i = 0; i < pevent->nr_events; i++) {
|
||||||
if (pevent->events[i]->id > event->id)
|
if (pevent->events[i]->id > event->id)
|
||||||
@ -637,6 +674,8 @@ static void add_event(struct pevent *pevent, struct event_format *event)
|
|||||||
pevent->nr_events++;
|
pevent->nr_events++;
|
||||||
|
|
||||||
event->pevent = pevent;
|
event->pevent = pevent;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int event_item_type(enum event_type type)
|
static int event_item_type(enum event_type type)
|
||||||
@ -1751,8 +1790,10 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)
|
|||||||
type == EVENT_DELIM && (strcmp(token, ")") == 0)) {
|
type == EVENT_DELIM && (strcmp(token, ")") == 0)) {
|
||||||
char *new_atom;
|
char *new_atom;
|
||||||
|
|
||||||
if (left->type != PRINT_ATOM)
|
if (left->type != PRINT_ATOM) {
|
||||||
die("bad pointer type");
|
do_warning("bad pointer type");
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
new_atom = realloc(left->atom.atom,
|
new_atom = realloc(left->atom.atom,
|
||||||
strlen(left->atom.atom) + 3);
|
strlen(left->atom.atom) + 3);
|
||||||
if (!new_atom)
|
if (!new_atom)
|
||||||
@ -1870,7 +1911,11 @@ eval_type_str(unsigned long long val, const char *type, int pointer)
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
ref = malloc_or_die(len);
|
ref = malloc(len);
|
||||||
|
if (!ref) {
|
||||||
|
do_warning("%s: not enough memory!", __func__);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
memcpy(ref, type, len);
|
memcpy(ref, type, len);
|
||||||
|
|
||||||
/* chop off the " *" */
|
/* chop off the " *" */
|
||||||
@ -1947,8 +1992,10 @@ eval_type_str(unsigned long long val, const char *type, int pointer)
|
|||||||
static unsigned long long
|
static unsigned long long
|
||||||
eval_type(unsigned long long val, struct print_arg *arg, int pointer)
|
eval_type(unsigned long long val, struct print_arg *arg, int pointer)
|
||||||
{
|
{
|
||||||
if (arg->type != PRINT_TYPE)
|
if (arg->type != PRINT_TYPE) {
|
||||||
die("expected type argument");
|
do_warning("expected type argument");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return eval_type_str(val, arg->typecast.type, pointer);
|
return eval_type_str(val, arg->typecast.type, pointer);
|
||||||
}
|
}
|
||||||
@ -2133,7 +2180,7 @@ static char *arg_eval (struct print_arg *arg)
|
|||||||
case PRINT_STRING:
|
case PRINT_STRING:
|
||||||
case PRINT_BSTRING:
|
case PRINT_BSTRING:
|
||||||
default:
|
default:
|
||||||
die("invalid eval type %d", arg->type);
|
do_warning("invalid eval type %d", arg->type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2431,8 +2478,10 @@ process_paren(struct event_format *event, struct print_arg *arg, char **tok)
|
|||||||
/* make this a typecast and contine */
|
/* make this a typecast and contine */
|
||||||
|
|
||||||
/* prevous must be an atom */
|
/* prevous must be an atom */
|
||||||
if (arg->type != PRINT_ATOM)
|
if (arg->type != PRINT_ATOM) {
|
||||||
die("previous needed to be PRINT_ATOM");
|
do_warning("previous needed to be PRINT_ATOM");
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
item_arg = alloc_arg();
|
item_arg = alloc_arg();
|
||||||
|
|
||||||
@ -2674,7 +2723,8 @@ process_arg_token(struct event_format *event, struct print_arg *arg,
|
|||||||
|
|
||||||
case EVENT_ERROR ... EVENT_NEWLINE:
|
case EVENT_ERROR ... EVENT_NEWLINE:
|
||||||
default:
|
default:
|
||||||
die("unexpected type %d", type);
|
do_warning("unexpected type %d", type);
|
||||||
|
return EVENT_ERROR;
|
||||||
}
|
}
|
||||||
*tok = token;
|
*tok = token;
|
||||||
|
|
||||||
@ -2921,8 +2971,10 @@ static int get_common_info(struct pevent *pevent,
|
|||||||
* All events should have the same common elements.
|
* All events should have the same common elements.
|
||||||
* Pick any event to find where the type is;
|
* Pick any event to find where the type is;
|
||||||
*/
|
*/
|
||||||
if (!pevent->events)
|
if (!pevent->events) {
|
||||||
die("no event_list!");
|
do_warning("no event_list!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
event = pevent->events[0];
|
event = pevent->events[0];
|
||||||
field = pevent_find_common_field(event, type);
|
field = pevent_find_common_field(event, type);
|
||||||
@ -3080,7 +3132,8 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
|
|||||||
if (!arg->field.field) {
|
if (!arg->field.field) {
|
||||||
arg->field.field = pevent_find_any_field(event, arg->field.name);
|
arg->field.field = pevent_find_any_field(event, arg->field.name);
|
||||||
if (!arg->field.field)
|
if (!arg->field.field)
|
||||||
die("field %s not found", arg->field.name);
|
goto out_warning_field;
|
||||||
|
|
||||||
}
|
}
|
||||||
/* must be a number */
|
/* must be a number */
|
||||||
val = pevent_read_number(pevent, data + arg->field.field->offset,
|
val = pevent_read_number(pevent, data + arg->field.field->offset,
|
||||||
@ -3141,8 +3194,10 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
|
|||||||
if (!larg->field.field) {
|
if (!larg->field.field) {
|
||||||
larg->field.field =
|
larg->field.field =
|
||||||
pevent_find_any_field(event, larg->field.name);
|
pevent_find_any_field(event, larg->field.name);
|
||||||
if (!larg->field.field)
|
if (!larg->field.field) {
|
||||||
die("field %s not found", larg->field.name);
|
arg = larg;
|
||||||
|
goto out_warning_field;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
field_size = larg->field.field->elementsize;
|
field_size = larg->field.field->elementsize;
|
||||||
offset = larg->field.field->offset +
|
offset = larg->field.field->offset +
|
||||||
@ -3178,7 +3233,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
|
|||||||
val = left != right;
|
val = left != right;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
die("unknown op '%s'", arg->op.op);
|
goto out_warning_op;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '~':
|
case '~':
|
||||||
@ -3208,7 +3263,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
|
|||||||
val = left <= right;
|
val = left <= right;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
die("unknown op '%s'", arg->op.op);
|
goto out_warning_op;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '>':
|
case '>':
|
||||||
@ -3223,12 +3278,13 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
|
|||||||
val = left >= right;
|
val = left >= right;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
die("unknown op '%s'", arg->op.op);
|
goto out_warning_op;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '=':
|
case '=':
|
||||||
if (arg->op.op[1] != '=')
|
if (arg->op.op[1] != '=')
|
||||||
die("unknown op '%s'", arg->op.op);
|
goto out_warning_op;
|
||||||
|
|
||||||
val = left == right;
|
val = left == right;
|
||||||
break;
|
break;
|
||||||
case '-':
|
case '-':
|
||||||
@ -3244,13 +3300,21 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
|
|||||||
val = left * right;
|
val = left * right;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
die("unknown op '%s'", arg->op.op);
|
goto out_warning_op;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: /* not sure what to do there */
|
default: /* not sure what to do there */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return val;
|
return val;
|
||||||
|
|
||||||
|
out_warning_op:
|
||||||
|
do_warning("%s: unknown op '%s'", __func__, arg->op.op);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
out_warning_field:
|
||||||
|
do_warning("%s: field %s not found", __func__, arg->field.name);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct flag {
|
struct flag {
|
||||||
@ -3327,8 +3391,10 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
|||||||
field = arg->field.field;
|
field = arg->field.field;
|
||||||
if (!field) {
|
if (!field) {
|
||||||
field = pevent_find_any_field(event, arg->field.name);
|
field = pevent_find_any_field(event, arg->field.name);
|
||||||
if (!field)
|
if (!field) {
|
||||||
die("field %s not found", arg->field.name);
|
str = arg->field.name;
|
||||||
|
goto out_warning_field;
|
||||||
|
}
|
||||||
arg->field.field = field;
|
arg->field.field = field;
|
||||||
}
|
}
|
||||||
/* Zero sized fields, mean the rest of the data */
|
/* Zero sized fields, mean the rest of the data */
|
||||||
@ -3345,7 +3411,11 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
|||||||
trace_seq_printf(s, "%lx", addr);
|
trace_seq_printf(s, "%lx", addr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
str = malloc_or_die(len + 1);
|
str = malloc(len + 1);
|
||||||
|
if (!str) {
|
||||||
|
do_warning("%s: not enough memory!", __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
memcpy(str, data + field->offset, len);
|
memcpy(str, data + field->offset, len);
|
||||||
str[len] = 0;
|
str[len] = 0;
|
||||||
print_str_to_seq(s, format, len_arg, str);
|
print_str_to_seq(s, format, len_arg, str);
|
||||||
@ -3385,7 +3455,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
|||||||
str = arg->hex.field->field.name;
|
str = arg->hex.field->field.name;
|
||||||
field = pevent_find_any_field(event, str);
|
field = pevent_find_any_field(event, str);
|
||||||
if (!field)
|
if (!field)
|
||||||
die("field %s not found", str);
|
goto out_warning_field;
|
||||||
arg->hex.field->field.field = field;
|
arg->hex.field->field.field = field;
|
||||||
}
|
}
|
||||||
hex = data + field->offset;
|
hex = data + field->offset;
|
||||||
@ -3437,6 +3507,11 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
|||||||
/* well... */
|
/* well... */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
out_warning_field:
|
||||||
|
do_warning("%s: field %s not found", __func__, arg->field.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long long
|
static unsigned long long
|
||||||
@ -3463,7 +3538,11 @@ process_defined_func(struct trace_seq *s, void *data, int size,
|
|||||||
farg = arg->func.args;
|
farg = arg->func.args;
|
||||||
param = func_handle->params;
|
param = func_handle->params;
|
||||||
|
|
||||||
args = malloc_or_die(sizeof(*args) * func_handle->nr_args);
|
ret = ULLONG_MAX;
|
||||||
|
args = malloc(sizeof(*args) * func_handle->nr_args);
|
||||||
|
if (!args)
|
||||||
|
goto out;
|
||||||
|
|
||||||
for (i = 0; i < func_handle->nr_args; i++) {
|
for (i = 0; i < func_handle->nr_args; i++) {
|
||||||
switch (param->type) {
|
switch (param->type) {
|
||||||
case PEVENT_FUNC_ARG_INT:
|
case PEVENT_FUNC_ARG_INT:
|
||||||
@ -3475,12 +3554,18 @@ process_defined_func(struct trace_seq *s, void *data, int size,
|
|||||||
trace_seq_init(&str);
|
trace_seq_init(&str);
|
||||||
print_str_arg(&str, data, size, event, "%s", -1, farg);
|
print_str_arg(&str, data, size, event, "%s", -1, farg);
|
||||||
trace_seq_terminate(&str);
|
trace_seq_terminate(&str);
|
||||||
string = malloc_or_die(sizeof(*string));
|
string = malloc(sizeof(*string));
|
||||||
|
if (!string) {
|
||||||
|
do_warning("%s(%d): malloc str", __func__, __LINE__);
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
string->next = strings;
|
string->next = strings;
|
||||||
string->str = strdup(str.buffer);
|
string->str = strdup(str.buffer);
|
||||||
if (!string->str)
|
if (!string->str) {
|
||||||
die("malloc str");
|
free(string);
|
||||||
|
do_warning("%s(%d): malloc str", __func__, __LINE__);
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
args[i] = (uintptr_t)string->str;
|
args[i] = (uintptr_t)string->str;
|
||||||
strings = string;
|
strings = string;
|
||||||
trace_seq_destroy(&str);
|
trace_seq_destroy(&str);
|
||||||
@ -3490,14 +3575,15 @@ process_defined_func(struct trace_seq *s, void *data, int size,
|
|||||||
* Something went totally wrong, this is not
|
* Something went totally wrong, this is not
|
||||||
* an input error, something in this code broke.
|
* an input error, something in this code broke.
|
||||||
*/
|
*/
|
||||||
die("Unexpected end of arguments\n");
|
do_warning("Unexpected end of arguments\n");
|
||||||
break;
|
goto out_free;
|
||||||
}
|
}
|
||||||
farg = farg->next;
|
farg = farg->next;
|
||||||
param = param->next;
|
param = param->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = (*func_handle->func)(s, args);
|
ret = (*func_handle->func)(s, args);
|
||||||
|
out_free:
|
||||||
free(args);
|
free(args);
|
||||||
while (strings) {
|
while (strings) {
|
||||||
string = strings;
|
string = strings;
|
||||||
@ -3538,11 +3624,15 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
|
|||||||
|
|
||||||
if (!field) {
|
if (!field) {
|
||||||
field = pevent_find_field(event, "buf");
|
field = pevent_find_field(event, "buf");
|
||||||
if (!field)
|
if (!field) {
|
||||||
die("can't find buffer field for binary printk");
|
do_warning("can't find buffer field for binary printk");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
ip_field = pevent_find_field(event, "ip");
|
ip_field = pevent_find_field(event, "ip");
|
||||||
if (!ip_field)
|
if (!ip_field) {
|
||||||
die("can't find ip field for binary printk");
|
do_warning("can't find ip field for binary printk");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
pevent->bprint_buf_field = field;
|
pevent->bprint_buf_field = field;
|
||||||
pevent->bprint_ip_field = ip_field;
|
pevent->bprint_ip_field = ip_field;
|
||||||
}
|
}
|
||||||
@ -3637,7 +3727,7 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
|
|||||||
arg->type = PRINT_BSTRING;
|
arg->type = PRINT_BSTRING;
|
||||||
arg->string.string = strdup(bptr);
|
arg->string.string = strdup(bptr);
|
||||||
if (!arg->string.string)
|
if (!arg->string.string)
|
||||||
break;
|
goto out_free;
|
||||||
bptr += strlen(bptr) + 1;
|
bptr += strlen(bptr) + 1;
|
||||||
*next = arg;
|
*next = arg;
|
||||||
next = &arg->next;
|
next = &arg->next;
|
||||||
@ -3669,8 +3759,10 @@ get_bprint_format(void *data, int size __maybe_unused,
|
|||||||
|
|
||||||
if (!field) {
|
if (!field) {
|
||||||
field = pevent_find_field(event, "fmt");
|
field = pevent_find_field(event, "fmt");
|
||||||
if (!field)
|
if (!field) {
|
||||||
die("can't find format field for binary printk");
|
do_warning("can't find format field for binary printk");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
pevent->bprint_fmt_field = field;
|
pevent->bprint_fmt_field = field;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3723,8 +3815,11 @@ static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size,
|
|||||||
if (!arg->field.field) {
|
if (!arg->field.field) {
|
||||||
arg->field.field =
|
arg->field.field =
|
||||||
pevent_find_any_field(event, arg->field.name);
|
pevent_find_any_field(event, arg->field.name);
|
||||||
if (!arg->field.field)
|
if (!arg->field.field) {
|
||||||
die("field %s not found", arg->field.name);
|
do_warning("%s: field %s not found",
|
||||||
|
__func__, arg->field.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (arg->field.field->size != 6) {
|
if (arg->field.field->size != 6) {
|
||||||
trace_seq_printf(s, "INVALIDMAC");
|
trace_seq_printf(s, "INVALIDMAC");
|
||||||
@ -4380,7 +4475,10 @@ get_event_fields(const char *type, const char *name,
|
|||||||
struct format_field *field;
|
struct format_field *field;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
fields = malloc_or_die(sizeof(*fields) * (count + 1));
|
fields = malloc(sizeof(*fields) * (count + 1));
|
||||||
|
if (!fields)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
for (field = list; field; field = field->next) {
|
for (field = list; field; field = field->next) {
|
||||||
fields[i++] = field;
|
fields[i++] = field;
|
||||||
if (i == count + 1) {
|
if (i == count + 1) {
|
||||||
@ -4775,7 +4873,8 @@ enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
|
|||||||
}
|
}
|
||||||
show_warning = 1;
|
show_warning = 1;
|
||||||
|
|
||||||
add_event(pevent, event);
|
if (add_event(pevent, event))
|
||||||
|
goto event_alloc_failed;
|
||||||
|
|
||||||
if (!ret && (event->flags & EVENT_FL_ISFTRACE)) {
|
if (!ret && (event->flags & EVENT_FL_ISFTRACE)) {
|
||||||
struct format_field *field;
|
struct format_field *field;
|
||||||
@ -4808,7 +4907,9 @@ enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
|
|||||||
event_parse_failed:
|
event_parse_failed:
|
||||||
event->flags |= EVENT_FL_FAILED;
|
event->flags |= EVENT_FL_FAILED;
|
||||||
/* still add it even if it failed */
|
/* still add it even if it failed */
|
||||||
add_event(pevent, event);
|
if (add_event(pevent, event))
|
||||||
|
goto event_alloc_failed;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
event_alloc_failed:
|
event_alloc_failed:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user