diff options
Diffstat (limited to 'security/yama/yama_lsm.c')
-rw-r--r-- | security/yama/yama_lsm.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/security/yama/yama_lsm.c b/security/yama/yama_lsm.c index dd4d36067c50..573723843a04 100644 --- a/security/yama/yama_lsm.c +++ b/security/yama/yama_lsm.c | |||
@@ -84,7 +84,7 @@ static void yama_ptracer_del(struct task_struct *tracer, | |||
84 | spin_lock_bh(&ptracer_relations_lock); | 84 | spin_lock_bh(&ptracer_relations_lock); |
85 | list_for_each_entry_safe(relation, safe, &ptracer_relations, node) | 85 | list_for_each_entry_safe(relation, safe, &ptracer_relations, node) |
86 | if (relation->tracee == tracee || | 86 | if (relation->tracee == tracee || |
87 | relation->tracer == tracer) { | 87 | (tracer && relation->tracer == tracer)) { |
88 | list_del(&relation->node); | 88 | list_del(&relation->node); |
89 | kfree(relation); | 89 | kfree(relation); |
90 | } | 90 | } |
@@ -138,6 +138,8 @@ static int yama_task_prctl(int option, unsigned long arg2, unsigned long arg3, | |||
138 | if (arg2 == 0) { | 138 | if (arg2 == 0) { |
139 | yama_ptracer_del(NULL, myself); | 139 | yama_ptracer_del(NULL, myself); |
140 | rc = 0; | 140 | rc = 0; |
141 | } else if (arg2 == PR_SET_PTRACER_ANY) { | ||
142 | rc = yama_ptracer_add(NULL, myself); | ||
141 | } else { | 143 | } else { |
142 | struct task_struct *tracer; | 144 | struct task_struct *tracer; |
143 | 145 | ||
@@ -208,6 +210,7 @@ static int ptracer_exception_found(struct task_struct *tracer, | |||
208 | int rc = 0; | 210 | int rc = 0; |
209 | struct ptrace_relation *relation; | 211 | struct ptrace_relation *relation; |
210 | struct task_struct *parent = NULL; | 212 | struct task_struct *parent = NULL; |
213 | bool found = false; | ||
211 | 214 | ||
212 | spin_lock_bh(&ptracer_relations_lock); | 215 | spin_lock_bh(&ptracer_relations_lock); |
213 | rcu_read_lock(); | 216 | rcu_read_lock(); |
@@ -216,10 +219,11 @@ static int ptracer_exception_found(struct task_struct *tracer, | |||
216 | list_for_each_entry(relation, &ptracer_relations, node) | 219 | list_for_each_entry(relation, &ptracer_relations, node) |
217 | if (relation->tracee == tracee) { | 220 | if (relation->tracee == tracee) { |
218 | parent = relation->tracer; | 221 | parent = relation->tracer; |
222 | found = true; | ||
219 | break; | 223 | break; |
220 | } | 224 | } |
221 | 225 | ||
222 | if (task_is_descendant(parent, tracer)) | 226 | if (found && (parent == NULL || task_is_descendant(parent, tracer))) |
223 | rc = 1; | 227 | rc = 1; |
224 | rcu_read_unlock(); | 228 | rcu_read_unlock(); |
225 | spin_unlock_bh(&ptracer_relations_lock); | 229 | spin_unlock_bh(&ptracer_relations_lock); |