]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
src: Initialize stack allocated virPCIDeviceAddress variables
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 11 Feb 2022 13:30:09 +0000 (14:30 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 11 Feb 2022 14:01:19 +0000 (15:01 +0100)
There are few places where a virPCIDeviceAddress typed variable
is allocated on the stack but it's not initialized. This can lead
to random values of its members which in turn can lead to a
random behaviour.

Generated with help of the following spatch:

  @@
  identifier I;
  @@
  - virPCIDeviceAddress I;
  + virPCIDeviceAddress I = { 0 };

And then fixing bhyveAssignDevicePCISlots() which does declare
the variable and then explicitly zero it by calling memset() only
to set a specific member afterwards.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
src/bhyve/bhyve_device.c
src/conf/domain_addr.c
src/conf/node_device_conf.c
src/hypervisor/domain_driver.c
src/node_device/node_device_udev.c
src/qemu/qemu_domain_address.c
src/util/virpci.c

index 36b93c0d4c0e6db68f7078e38e507eefb46111ec..5654028ca5ab04622ef875daf49405c4cba5ec9d 100644 (file)
@@ -83,10 +83,7 @@ bhyveAssignDevicePCISlots(virDomainDef *def,
                           virDomainPCIAddressSet *addrs)
 {
     size_t i;
-    virPCIDeviceAddress lpc_addr;
-
-    memset(&lpc_addr, 0, sizeof(lpc_addr));
-    lpc_addr.slot = 0x1;
+    virPCIDeviceAddress lpc_addr = { .slot = 0x1 };
 
     /* If the user didn't explicitly specify slot 1 for some of the devices,
        reserve it for LPC, even if there's no LPC device configured.
index 49745ba8818c87512c72e17fbff6f40882d874fc..49ca775a5273b61bd559a598cc987dadd5c3dc47 100644 (file)
@@ -1181,7 +1181,7 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSet *addrs,
                                    virDomainPCIConnectFlags flags,
                                    int function)
 {
-    virPCIDeviceAddress addr;
+    virPCIDeviceAddress addr = { 0 };
 
     if (virDomainPCIAddressGetNextAddr(addrs, &addr, flags,
                                        dev->isolationGroup, function) < 0)
index 61c87150377ab88617848a9abf67b4ef5fb4562f..8b20a7bee9c70757a086410db04cbbb3f99cb8d5 100644 (file)
@@ -2947,7 +2947,7 @@ virNodeDeviceGetPCIIOMMUGroupCaps(virNodeDevCapPCIDev *pci_dev)
 {
     size_t i;
     int tmpGroup;
-    virPCIDeviceAddress addr;
+    virPCIDeviceAddress addr = { 0 };
 
     /* this could be a refresh, so clear out the old data */
     for (i = 0; i < pci_dev->nIommuGroupDevices; i++)
@@ -3018,7 +3018,7 @@ static int
 virNodeDeviceGetPCIVPDDynamicCap(virNodeDevCapPCIDev *devCapPCIDev)
 {
     g_autoptr(virPCIDevice) pciDev = NULL;
-    virPCIDeviceAddress devAddr;
+    virPCIDeviceAddress devAddr = { 0 };
     g_autoptr(virPCIVPDResource) res = NULL;
 
     devAddr.domain = devCapPCIDev->domain;
index 2083f062878e0aa6cff116dfaa686a80aebde619..bb1da7ac6bac63d80f82d635ea5ade05056fa54b 100644 (file)
@@ -375,7 +375,7 @@ virDomainDriverNodeDeviceReset(virNodeDevicePtr dev,
                                virHostdevManager *hostdevMgr)
 {
     g_autoptr(virPCIDevice) pci = NULL;
-    virPCIDeviceAddress devAddr;
+    virPCIDeviceAddress devAddr = { 0 };
     g_autoptr(virNodeDeviceDef) def = NULL;
     g_autofree char *xml = NULL;
     g_autoptr(virConnect) nodeconn = NULL;
@@ -421,7 +421,7 @@ virDomainDriverNodeDeviceReAttach(virNodeDevicePtr dev,
                                   virHostdevManager *hostdevMgr)
 {
     g_autoptr(virPCIDevice) pci = NULL;
-    virPCIDeviceAddress devAddr;
+    virPCIDeviceAddress devAddr = { 0 };
     g_autoptr(virNodeDeviceDef) def = NULL;
     g_autofree char *xml = NULL;
     g_autoptr(virConnect) nodeconn = NULL;
@@ -466,7 +466,7 @@ virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
                                      const char *driverName)
 {
     g_autoptr(virPCIDevice) pci = NULL;
-    virPCIDeviceAddress devAddr;
+    virPCIDeviceAddress devAddr = { 0 };
     g_autoptr(virNodeDeviceDef) def = NULL;
     g_autofree char *xml = NULL;
     g_autoptr(virConnect) nodeconn = NULL;
index 3d5e25424a08b130de9fa8eb9fdfb9d43d99ae19..b0a5e6302c50574d1d7f6e629f45ef7fb32a8a00 100644 (file)
@@ -366,7 +366,7 @@ udevProcessPCI(struct udev_device *device,
     virNodeDevCapPCIDev *pci_dev = &def->caps->data.pci_dev;
     virPCIEDeviceInfo *pci_express = NULL;
     virPCIDevice *pciDev = NULL;
-    virPCIDeviceAddress devAddr;
+    virPCIDeviceAddress devAddr = { 0 };
     int ret = -1;
     char *p;
     bool privileged = false;
index 4e7095d3a7f7dff87ac4e34b99019d2a9530b1ec..dd0680f57f17cf86da46e4960505f4f0651cc9a5 100644 (file)
@@ -1743,7 +1743,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDef *def,
                                       virDomainPCIAddressSet *addrs)
 {
     size_t i;
-    virPCIDeviceAddress tmp_addr;
+    virPCIDeviceAddress tmp_addr = { 0 };
     g_autofree char *addrStr = NULL;
     virDomainPCIConnectFlags flags = (VIR_PCI_CONNECT_AUTOASSIGN
                                       | VIR_PCI_CONNECT_TYPE_PCI_DEVICE);
@@ -1853,7 +1853,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDef *def,
                                     virDomainPCIAddressSet *addrs)
 {
     size_t i;
-    virPCIDeviceAddress tmp_addr;
+    virPCIDeviceAddress tmp_addr = { 0 };
     g_autofree char *addrStr = NULL;
     virDomainPCIConnectFlags flags = VIR_PCI_CONNECT_TYPE_PCIE_DEVICE;
 
index adc255f43802125f55f1504de72063a591a5d253..d141fde814147a78d5dcf74dad037ebdbfaf8d41 100644 (file)
@@ -1865,7 +1865,7 @@ virPCIDeviceAddressIOMMUGroupIterate(virPCIDeviceAddress *orig,
     }
 
     while ((direrr = virDirRead(groupDir, &ent, groupPath)) > 0) {
-        virPCIDeviceAddress newDev;
+        virPCIDeviceAddress newDev = { 0 };
 
         if (virPCIDeviceAddressParse(ent->d_name, &newDev) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR,