Commit 94032c50 authored by Konrad Rzeszutek Wilk's avatar Konrad Rzeszutek Wilk

xen/events: Check that IRQ value passed in is valid.

We naively assume that the IRQ value passed in is correct.
If it is not, then any dereference operation for the 'info'
structure will result in crash - so might as well guard ourselves
and sprinkle copious amounts of WARN_ON.
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 7918c92a
...@@ -515,6 +515,9 @@ static void xen_free_irq(unsigned irq) ...@@ -515,6 +515,9 @@ static void xen_free_irq(unsigned irq)
{ {
struct irq_info *info = irq_get_handler_data(irq); struct irq_info *info = irq_get_handler_data(irq);
if (WARN_ON(!info))
return;
list_del(&info->list); list_del(&info->list);
irq_set_handler_data(irq, NULL); irq_set_handler_data(irq, NULL);
...@@ -1003,6 +1006,9 @@ static void unbind_from_irq(unsigned int irq) ...@@ -1003,6 +1006,9 @@ static void unbind_from_irq(unsigned int irq)
int evtchn = evtchn_from_irq(irq); int evtchn = evtchn_from_irq(irq);
struct irq_info *info = irq_get_handler_data(irq); struct irq_info *info = irq_get_handler_data(irq);
if (WARN_ON(!info))
return;
mutex_lock(&irq_mapping_update_lock); mutex_lock(&irq_mapping_update_lock);
if (info->refcnt > 0) { if (info->refcnt > 0) {
...@@ -1130,6 +1136,10 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi, ...@@ -1130,6 +1136,10 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,
void unbind_from_irqhandler(unsigned int irq, void *dev_id) void unbind_from_irqhandler(unsigned int irq, void *dev_id)
{ {
struct irq_info *info = irq_get_handler_data(irq);
if (WARN_ON(!info))
return;
free_irq(irq, dev_id); free_irq(irq, dev_id);
unbind_from_irq(irq); unbind_from_irq(irq);
} }
...@@ -1441,6 +1451,9 @@ void rebind_evtchn_irq(int evtchn, int irq) ...@@ -1441,6 +1451,9 @@ void rebind_evtchn_irq(int evtchn, int irq)
{ {
struct irq_info *info = info_for_irq(irq); struct irq_info *info = info_for_irq(irq);
if (WARN_ON(!info))
return;
/* Make sure the irq is masked, since the new event channel /* Make sure the irq is masked, since the new event channel
will also be masked. */ will also be masked. */
disable_irq(irq); disable_irq(irq);
...@@ -1714,7 +1727,12 @@ void xen_poll_irq(int irq) ...@@ -1714,7 +1727,12 @@ void xen_poll_irq(int irq)
int xen_test_irq_shared(int irq) int xen_test_irq_shared(int irq)
{ {
struct irq_info *info = info_for_irq(irq); struct irq_info *info = info_for_irq(irq);
struct physdev_irq_status_query irq_status = { .irq = info->u.pirq.pirq }; struct physdev_irq_status_query irq_status;
if (WARN_ON(!info))
return -ENOENT;
irq_status.irq = info->u.pirq.pirq;
if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status)) if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status))
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment