mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
sparc: fix array overrun check in of_device_64.c
Do the array length check and fixup before copying the array. Signed-off-by: Robert Reif <reif@earthlink.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e6b04fe0ba
commit
92d9091f30
@ -811,20 +811,20 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
|
|||||||
|
|
||||||
irq = of_get_property(dp, "interrupts", &len);
|
irq = of_get_property(dp, "interrupts", &len);
|
||||||
if (irq) {
|
if (irq) {
|
||||||
memcpy(op->irqs, irq, len);
|
|
||||||
op->num_irqs = len / 4;
|
op->num_irqs = len / 4;
|
||||||
|
|
||||||
|
/* Prevent overrunning the op->irqs[] array. */
|
||||||
|
if (op->num_irqs > PROMINTR_MAX) {
|
||||||
|
printk(KERN_WARNING "%s: Too many irqs (%d), "
|
||||||
|
"limiting to %d.\n",
|
||||||
|
dp->full_name, op->num_irqs, PROMINTR_MAX);
|
||||||
|
op->num_irqs = PROMINTR_MAX;
|
||||||
|
}
|
||||||
|
memcpy(op->irqs, irq, op->num_irqs * 4);
|
||||||
} else {
|
} else {
|
||||||
op->num_irqs = 0;
|
op->num_irqs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prevent overrunning the op->irqs[] array. */
|
|
||||||
if (op->num_irqs > PROMINTR_MAX) {
|
|
||||||
printk(KERN_WARNING "%s: Too many irqs (%d), "
|
|
||||||
"limiting to %d.\n",
|
|
||||||
dp->full_name, op->num_irqs, PROMINTR_MAX);
|
|
||||||
op->num_irqs = PROMINTR_MAX;
|
|
||||||
}
|
|
||||||
|
|
||||||
build_device_resources(op, parent);
|
build_device_resources(op, parent);
|
||||||
for (i = 0; i < op->num_irqs; i++)
|
for (i = 0; i < op->num_irqs; i++)
|
||||||
op->irqs[i] = build_one_device_irq(op, parent, op->irqs[i]);
|
op->irqs[i] = build_one_device_irq(op, parent, op->irqs[i]);
|
||||||
|
Loading…
Reference in New Issue
Block a user