diff options
author | Matthew Wilcox <matthew@wil.cx> | 2005-11-03 09:51:18 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-23 14:11:28 -0500 |
commit | c2b5a251b9feca727661f1a3278cafb1de4c80f3 (patch) | |
tree | 499369ecd5ef3af4f409df9d86c5e3c5bd4ca2de /kernel | |
parent | 2d0ebb36038c0626cde662a3b06da9787cfb68c3 (diff) |
[PATCH] Check the irq number is within bounds
Most of the functions already check. Do the ones that didn't.
Signed-off-by: Matthew Wilcox <matthew@wil.cx>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/irq/manage.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 3bd7226d15f..81c49a4d679 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -36,6 +36,9 @@ void synchronize_irq(unsigned int irq) | |||
36 | { | 36 | { |
37 | struct irq_desc *desc = irq_desc + irq; | 37 | struct irq_desc *desc = irq_desc + irq; |
38 | 38 | ||
39 | if (irq >= NR_IRQS) | ||
40 | return; | ||
41 | |||
39 | while (desc->status & IRQ_INPROGRESS) | 42 | while (desc->status & IRQ_INPROGRESS) |
40 | cpu_relax(); | 43 | cpu_relax(); |
41 | } | 44 | } |
@@ -60,6 +63,9 @@ void disable_irq_nosync(unsigned int irq) | |||
60 | irq_desc_t *desc = irq_desc + irq; | 63 | irq_desc_t *desc = irq_desc + irq; |
61 | unsigned long flags; | 64 | unsigned long flags; |
62 | 65 | ||
66 | if (irq >= NR_IRQS) | ||
67 | return; | ||
68 | |||
63 | spin_lock_irqsave(&desc->lock, flags); | 69 | spin_lock_irqsave(&desc->lock, flags); |
64 | if (!desc->depth++) { | 70 | if (!desc->depth++) { |
65 | desc->status |= IRQ_DISABLED; | 71 | desc->status |= IRQ_DISABLED; |
@@ -86,6 +92,9 @@ void disable_irq(unsigned int irq) | |||
86 | { | 92 | { |
87 | irq_desc_t *desc = irq_desc + irq; | 93 | irq_desc_t *desc = irq_desc + irq; |
88 | 94 | ||
95 | if (irq >= NR_IRQS) | ||
96 | return; | ||
97 | |||
89 | disable_irq_nosync(irq); | 98 | disable_irq_nosync(irq); |
90 | if (desc->action) | 99 | if (desc->action) |
91 | synchronize_irq(irq); | 100 | synchronize_irq(irq); |
@@ -108,6 +117,9 @@ void enable_irq(unsigned int irq) | |||
108 | irq_desc_t *desc = irq_desc + irq; | 117 | irq_desc_t *desc = irq_desc + irq; |
109 | unsigned long flags; | 118 | unsigned long flags; |
110 | 119 | ||
120 | if (irq >= NR_IRQS) | ||
121 | return; | ||
122 | |||
111 | spin_lock_irqsave(&desc->lock, flags); | 123 | spin_lock_irqsave(&desc->lock, flags); |
112 | switch (desc->depth) { | 124 | switch (desc->depth) { |
113 | case 0: | 125 | case 0: |
@@ -163,6 +175,9 @@ int setup_irq(unsigned int irq, struct irqaction * new) | |||
163 | unsigned long flags; | 175 | unsigned long flags; |
164 | int shared = 0; | 176 | int shared = 0; |
165 | 177 | ||
178 | if (irq >= NR_IRQS) | ||
179 | return -EINVAL; | ||
180 | |||
166 | if (desc->handler == &no_irq_type) | 181 | if (desc->handler == &no_irq_type) |
167 | return -ENOSYS; | 182 | return -ENOSYS; |
168 | /* | 183 | /* |