diff options
| author | Oleg Nesterov <oleg@redhat.com> | 2014-06-27 13:01:40 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2014-06-30 13:22:15 -0400 |
| commit | 06d0713904e508f765e0d7146c14b67bbd248fe7 (patch) | |
| tree | 568f93a984be6f8b1524e4883130aee38fe6692e | |
| parent | 48212542067a7ff6cbe829dbae279c2ff7557b44 (diff) | |
uprobes: Change unregister/apply to WARN() if uprobe/consumer is gone
Add WARN_ON's into uprobe_unregister() and uprobe_apply() to ensure
that nobody tries to play with the dead uprobe/consumer. This helps
to catch the bugs like the one fixed by the previous patch.
In the longer term we should fix this poorly designed interface.
uprobe_register() should return "struct uprobe *" which should be
passed to apply/unregister. Plus other semantic changes, see the
changelog in commit 41ccba029e94.
Link: http://lkml.kernel.org/p/20140627170140.GA18322@redhat.com
Acked-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
| -rw-r--r-- | kernel/events/uprobes.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index c445e392e93f..6f3254e8c137 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c | |||
| @@ -846,7 +846,7 @@ static void __uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *u | |||
| 846 | { | 846 | { |
| 847 | int err; | 847 | int err; |
| 848 | 848 | ||
| 849 | if (!consumer_del(uprobe, uc)) /* WARN? */ | 849 | if (WARN_ON(!consumer_del(uprobe, uc))) |
| 850 | return; | 850 | return; |
| 851 | 851 | ||
| 852 | err = register_for_each_vma(uprobe, NULL); | 852 | err = register_for_each_vma(uprobe, NULL); |
| @@ -927,7 +927,7 @@ int uprobe_apply(struct inode *inode, loff_t offset, | |||
| 927 | int ret = -ENOENT; | 927 | int ret = -ENOENT; |
| 928 | 928 | ||
| 929 | uprobe = find_uprobe(inode, offset); | 929 | uprobe = find_uprobe(inode, offset); |
| 930 | if (!uprobe) | 930 | if (WARN_ON(!uprobe)) |
| 931 | return ret; | 931 | return ret; |
| 932 | 932 | ||
| 933 | down_write(&uprobe->register_rwsem); | 933 | down_write(&uprobe->register_rwsem); |
| @@ -952,7 +952,7 @@ void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consume | |||
| 952 | struct uprobe *uprobe; | 952 | struct uprobe *uprobe; |
| 953 | 953 | ||
| 954 | uprobe = find_uprobe(inode, offset); | 954 | uprobe = find_uprobe(inode, offset); |
| 955 | if (!uprobe) | 955 | if (WARN_ON(!uprobe)) |
| 956 | return; | 956 | return; |
| 957 | 957 | ||
| 958 | down_write(&uprobe->register_rwsem); | 958 | down_write(&uprobe->register_rwsem); |
