mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
s390/vfio-ap: fix potential use of uninitialized apm_filtered bitmap
The DECLARE_BITMAP(apm_filtered, AP_DEVICES) macro allocates the bitmap
on the stack without zero-initializing it.
In vfio_ap_mdev_hot_plug_cfg(), the vfio_ap_mdev_filter_matrix() function
is only called to initialize and populate apm_filtered if either
filter_adapters or filter_domains is true. If the hot plug configuration
change only adds control domains (meaning filter_cdoms is true, but
filter_adapters and filter_domains are both false),
vfio_ap_mdev_filter_matrix() is bypassed.
Consequently, apm_filtered is passed to reset_queues_for_apids() with
uninitialized stack garbage. This can cause reset_queues_for_apids() to
interpret arbitrary stack garbage bits as valid APIDs to reset, potentially
performing unintended guest hardware queue resets.
Fix this by zero-initializing the apm_filtered bitmap at the beginning of
vfio_ap_mdev_hot_plug_cfg() using bitmap_zero().
Fixes: eeb386aeb5 ("s390/vfio-ap: handle config changed and scan complete notification")
Cc: stable@vger.kernel.org
Signed-off-by: Anthony Krowiak <akrowiak@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
This commit is contained in:
parent
6b8a02e216
commit
bf09b9d7cd
|
|
@ -2856,6 +2856,15 @@ static void vfio_ap_mdev_hot_plug_cfg(struct ap_matrix_mdev *matrix_mdev)
|
|||
DECLARE_BITMAP(apm_filtered, AP_DEVICES);
|
||||
bool filter_domains, filter_adapters, filter_cdoms, do_hotplug = false;
|
||||
|
||||
/*
|
||||
* Zero out the apm_filtered bitmap in case there are no adapters or
|
||||
* domains to be added, but only control domains. In that case,
|
||||
* vfio_ap_mdev_filter_matrix() - which initializes apm_filtered - will
|
||||
* not get called and the reset_queues_for_apids will crash because it
|
||||
* will access an uninitialized bitmap.
|
||||
*/
|
||||
bitmap_zero(apm_filtered, AP_DEVICES);
|
||||
|
||||
filter_adapters = bitmap_intersects(matrix_mdev->matrix.apm,
|
||||
matrix_mdev->apm_add, AP_DEVICES);
|
||||
filter_domains = bitmap_intersects(matrix_mdev->matrix.aqm,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user