mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 05:04:09 +08:00
tracing: Make -ENOMEM the default error for parse_synth_field()
parse_synth_field() returns a pointer and requires that errors get
surrounded by ERR_PTR(). The ret variable is initialized to zero, but should
never be used as zero, and if it is, it could cause a false return code and
produce a NULL pointer dereference. It makes no sense to set ret to zero.
Set ret to -ENOMEM (the most common error case), and have any other errors
set it to something else. This removes the need to initialize ret on *every*
error branch.
Fixes: 761a8c58db
("tracing, synthetic events: Replace buggy strcat() with seq_buf operations")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
b02414c8f0
commit
561ca66910
@ -584,7 +584,7 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
|||||||
{
|
{
|
||||||
struct synth_field *field;
|
struct synth_field *field;
|
||||||
const char *prefix = NULL, *field_type = argv[0], *field_name, *array;
|
const char *prefix = NULL, *field_type = argv[0], *field_name, *array;
|
||||||
int len, ret = 0;
|
int len, ret = -ENOMEM;
|
||||||
struct seq_buf s;
|
struct seq_buf s;
|
||||||
ssize_t size;
|
ssize_t size;
|
||||||
|
|
||||||
@ -617,10 +617,9 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
|||||||
len--;
|
len--;
|
||||||
|
|
||||||
field->name = kmemdup_nul(field_name, len, GFP_KERNEL);
|
field->name = kmemdup_nul(field_name, len, GFP_KERNEL);
|
||||||
if (!field->name) {
|
if (!field->name)
|
||||||
ret = -ENOMEM;
|
|
||||||
goto free;
|
goto free;
|
||||||
}
|
|
||||||
if (!is_good_name(field->name)) {
|
if (!is_good_name(field->name)) {
|
||||||
synth_err(SYNTH_ERR_BAD_NAME, errpos(field_name));
|
synth_err(SYNTH_ERR_BAD_NAME, errpos(field_name));
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
@ -638,10 +637,9 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
|||||||
len += strlen(prefix);
|
len += strlen(prefix);
|
||||||
|
|
||||||
field->type = kzalloc(len, GFP_KERNEL);
|
field->type = kzalloc(len, GFP_KERNEL);
|
||||||
if (!field->type) {
|
if (!field->type)
|
||||||
ret = -ENOMEM;
|
|
||||||
goto free;
|
goto free;
|
||||||
}
|
|
||||||
seq_buf_init(&s, field->type, len);
|
seq_buf_init(&s, field->type, len);
|
||||||
if (prefix)
|
if (prefix)
|
||||||
seq_buf_puts(&s, prefix);
|
seq_buf_puts(&s, prefix);
|
||||||
@ -653,6 +651,7 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
|||||||
}
|
}
|
||||||
if (WARN_ON_ONCE(!seq_buf_buffer_left(&s)))
|
if (WARN_ON_ONCE(!seq_buf_buffer_left(&s)))
|
||||||
goto free;
|
goto free;
|
||||||
|
|
||||||
s.buffer[s.len] = '\0';
|
s.buffer[s.len] = '\0';
|
||||||
|
|
||||||
size = synth_field_size(field->type);
|
size = synth_field_size(field->type);
|
||||||
@ -666,10 +665,8 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
|||||||
|
|
||||||
len = sizeof("__data_loc ") + strlen(field->type) + 1;
|
len = sizeof("__data_loc ") + strlen(field->type) + 1;
|
||||||
type = kzalloc(len, GFP_KERNEL);
|
type = kzalloc(len, GFP_KERNEL);
|
||||||
if (!type) {
|
if (!type)
|
||||||
ret = -ENOMEM;
|
|
||||||
goto free;
|
goto free;
|
||||||
}
|
|
||||||
|
|
||||||
seq_buf_init(&s, type, len);
|
seq_buf_init(&s, type, len);
|
||||||
seq_buf_puts(&s, "__data_loc ");
|
seq_buf_puts(&s, "__data_loc ");
|
||||||
|
Loading…
Reference in New Issue
Block a user