tracing: Fix wrong usage of strstrip in trace_ksyms

strstrip returns a pointer to the first non space character, but the
code in parse_ksym_trace_str() ignores that.

strstrip is now must_check and therefor we get the correct warning:
kernel/trace/trace_ksym.c:294: warning:
ignoring return value of ‘strstrip’, declared with attribute warn_unused_result

We are really not interested in leading whitespace here.

Fix that and cleanup the dozen kfree() exit pathes.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
Thomas Gleixner 2009-12-10 23:46:52 +01:00
parent 788d70dce0
commit d954fbf0ff

View file

@ -277,21 +277,20 @@ static ssize_t ksym_trace_filter_write(struct file *file,
{ {
struct trace_ksym *entry; struct trace_ksym *entry;
struct hlist_node *node; struct hlist_node *node;
char *input_string, *ksymname = NULL; char *buf, *input_string, *ksymname = NULL;
unsigned long ksym_addr = 0; unsigned long ksym_addr = 0;
int ret, op, changed = 0; int ret, op, changed = 0;
input_string = kzalloc(count + 1, GFP_KERNEL); buf = kzalloc(count + 1, GFP_KERNEL);
if (!input_string) if (!buf)
return -ENOMEM; return -ENOMEM;
if (copy_from_user(input_string, buffer, count)) { ret = -EFAULT;
kfree(input_string); if (copy_from_user(buf, buffer, count))
return -EFAULT; goto out;
}
input_string[count] = '\0';
strstrip(input_string); buf[count] = '\0';
input_string = strstrip(buf);
/* /*
* Clear all breakpoints if: * Clear all breakpoints if:
@ -302,15 +301,13 @@ static ssize_t ksym_trace_filter_write(struct file *file,
if (!input_string[0] || !strcmp(input_string, "0") || if (!input_string[0] || !strcmp(input_string, "0") ||
!strcmp(input_string, "*:---")) { !strcmp(input_string, "*:---")) {
__ksym_trace_reset(); __ksym_trace_reset();
kfree(input_string); ret = 0;
return count; goto out;
} }
ret = op = parse_ksym_trace_str(input_string, &ksymname, &ksym_addr); ret = op = parse_ksym_trace_str(input_string, &ksymname, &ksym_addr);
if (ret < 0) { if (ret < 0)
kfree(input_string); goto out;
return ret;
}
mutex_lock(&ksym_tracer_mutex); mutex_lock(&ksym_tracer_mutex);
@ -321,7 +318,7 @@ static ssize_t ksym_trace_filter_write(struct file *file,
if (entry->attr.bp_type != op) if (entry->attr.bp_type != op)
changed = 1; changed = 1;
else else
goto out; goto out_unlock;
break; break;
} }
} }
@ -336,28 +333,24 @@ static ssize_t ksym_trace_filter_write(struct file *file,
if (IS_ERR(entry->ksym_hbp)) if (IS_ERR(entry->ksym_hbp))
ret = PTR_ERR(entry->ksym_hbp); ret = PTR_ERR(entry->ksym_hbp);
else else
goto out; goto out_unlock;
} }
/* Error or "symbol:---" case: drop it */ /* Error or "symbol:---" case: drop it */
ksym_filter_entry_count--; ksym_filter_entry_count--;
hlist_del_rcu(&(entry->ksym_hlist)); hlist_del_rcu(&(entry->ksym_hlist));
synchronize_rcu(); synchronize_rcu();
kfree(entry); kfree(entry);
goto out; goto out_unlock;
} else { } else {
/* Check for malformed request: (4) */ /* Check for malformed request: (4) */
if (op == 0) if (op)
goto out; ret = process_new_ksym_entry(ksymname, op, ksym_addr);
ret = process_new_ksym_entry(ksymname, op, ksym_addr);
} }
out: out_unlock:
mutex_unlock(&ksym_tracer_mutex); mutex_unlock(&ksym_tracer_mutex);
out:
kfree(input_string); kfree(buf);
return !ret ? count : ret;
if (!ret)
ret = count;
return ret;
} }
static const struct file_operations ksym_tracing_fops = { static const struct file_operations ksym_tracing_fops = {