summaryrefslogtreecommitdiff
path: root/kernel/marker.c
diff options
context:
space:
mode:
authorJesper Juhl <jesper.juhl@gmail.com>2008-03-04 14:29:00 -0800
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-03-04 16:35:14 -0800
commit544adb41077a10d299a1094f12ec55a5843a9bdb (patch)
treec865b4792e67fcd96171a514c3a649fcce0cde39 /kernel/marker.c
parent7088655477b51a5a248fa54190388e1283ba7ebf (diff)
downloadlwn-544adb41077a10d299a1094f12ec55a5843a9bdb.tar.gz
lwn-544adb41077a10d299a1094f12ec55a5843a9bdb.zip
markers: don't risk NULL deref in marker
get_marker() may return NULL, so test for it. [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: Jesper Juhl <jesper.juhl@gmail.com> Acked-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/marker.c')
-rw-r--r--kernel/marker.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/kernel/marker.c b/kernel/marker.c
index 50effc01d9a2..48a4ea5afffd 100644
--- a/kernel/marker.c
+++ b/kernel/marker.c
@@ -698,14 +698,12 @@ int marker_probe_unregister(const char *name,
{
struct marker_entry *entry;
struct marker_probe_closure *old;
- int ret = 0;
+ int ret = -ENOENT;
mutex_lock(&markers_mutex);
entry = get_marker(name);
- if (!entry) {
- ret = -ENOENT;
+ if (!entry)
goto end;
- }
if (entry->rcu_pending)
rcu_barrier();
old = marker_entry_remove_probe(entry, probe, probe_private);
@@ -713,12 +711,15 @@ int marker_probe_unregister(const char *name,
marker_update_probes(); /* may update entry */
mutex_lock(&markers_mutex);
entry = get_marker(name);
+ if (!entry)
+ goto end;
entry->oldptr = old;
entry->rcu_pending = 1;
/* write rcu_pending before calling the RCU callback */
smp_wmb();
call_rcu(&entry->rcu, free_old_closure);
remove_marker(name); /* Ignore busy error message */
+ ret = 0;
end:
mutex_unlock(&markers_mutex);
return ret;