|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/vPIC: check values loaded from state save record
Loading is_master from the state save record can lead to out-of-bounds
accesses via at least the two container_of() uses by vpic_domain() and
__vpic_lock(). Calculate the field from the supplied instance number
instead. Adjust the public header comment accordingly.
For ELCR follow what vpic_intercept_elcr_io()'s write path and
vpic_reset() do.
Convert ->int_output (which for whatever reason isn't a 1-bit bitfield)
to boolean, also taking ->init_state into account.
While there also correct vpic_domain() itself, to use its parameter in
both places.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
Of course an alternative would be to simply reject state save records
with bogus values.
--- a/xen/arch/x86/hvm/vpic.c
+++ b/xen/arch/x86/hvm/vpic.c
@@ -35,7 +35,7 @@
#include <asm/hvm/save.h>
#define vpic_domain(v) (container_of((v), struct domain, \
- arch.hvm.vpic[!vpic->is_master]))
+ arch.hvm.vpic[!(v)->is_master]))
#define __vpic_lock(v) &container_of((v), struct hvm_domain, \
vpic[!(v)->is_master])->irq_lock
#define vpic_lock(v) spin_lock(__vpic_lock(v))
@@ -437,6 +437,14 @@ static int cf_check vpic_load(struct dom
if ( hvm_load_entry(PIC, h, s) != 0 )
return -EINVAL;
+ s->is_master = !inst;
+
+ s->elcr &= vpic_elcr_mask(s);
+ if ( s->is_master )
+ s->elcr |= 1 << 2;
+
+ s->int_output = !s->init_state && s->int_output;
+
return 0;
}
--- a/xen/include/public/arch-x86/hvm/save.h
+++ b/xen/include/public/arch-x86/hvm/save.h
@@ -329,7 +329,10 @@ struct hvm_hw_vpic {
/* Special mask mode excludes masked IRs from AEOI and priority checks. */
uint8_t special_mask_mode:1;
- /* Is this a master PIC or slave PIC? (NB. This is not programmable.) */
+ /*
+ * Is this the master PIC or a slave one? (NB. This is not programmable,
+ * and hence is ignored upon loading.)
+ */
uint8_t is_master:1;
/* Edge/trigger selection. */
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |