diff options
author | Dmitry Adamushko <dmitry.adamushko@gmail.com> | 2007-05-08 03:27:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 14:15:05 -0400 |
commit | d2d9433a4c84c9e7ed78d633fdbffb35d5afda17 (patch) | |
tree | 5a9fb2c9531bec148f21fc499d49493b5576e79c /kernel | |
parent | c467a388ae9f236c039d4d0f4c4be07c7deebe97 (diff) |
kernel/irq/proc.c: unprotected iteration over the IRQ action list in name_unique()
setup_irq() releases a desc->lock before calling register_handler_proc(), so
the iteration over the IRQ action list is not protected.
(akpm: the check itself is still racy, but at least it probably won't oops
now).
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/irq/proc.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index 2db91eb54ad8..ddde0ef9ccdc 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
@@ -66,12 +66,19 @@ static int name_unique(unsigned int irq, struct irqaction *new_action) | |||
66 | { | 66 | { |
67 | struct irq_desc *desc = irq_desc + irq; | 67 | struct irq_desc *desc = irq_desc + irq; |
68 | struct irqaction *action; | 68 | struct irqaction *action; |
69 | unsigned long flags; | ||
70 | int ret = 1; | ||
69 | 71 | ||
70 | for (action = desc->action ; action; action = action->next) | 72 | spin_lock_irqsave(&desc->lock, flags); |
73 | for (action = desc->action ; action; action = action->next) { | ||
71 | if ((action != new_action) && action->name && | 74 | if ((action != new_action) && action->name && |
72 | !strcmp(new_action->name, action->name)) | 75 | !strcmp(new_action->name, action->name)) { |
73 | return 0; | 76 | ret = 0; |
74 | return 1; | 77 | break; |
78 | } | ||
79 | } | ||
80 | spin_unlock_irqrestore(&desc->lock, flags); | ||
81 | return ret; | ||
75 | } | 82 | } |
76 | 83 | ||
77 | void register_handler_proc(unsigned int irq, struct irqaction *action) | 84 | void register_handler_proc(unsigned int irq, struct irqaction *action) |