Hi Philippe, On Mon, Aug 9, 2021 at 1:46 PM Philippe Mathieu-Daudé <phi...@redhat.com> wrote:
> Hi Kostiantyn, > > On 8/9/21 11:48 AM, Kostiantyn Kostiuk wrote: > > Signed-off-by: Kostiantyn Kostiuk <konstan...@daynix.com> > > I'm not sure what you are trying to do here, fix a memory leak? > Yes. This set of patches fix a memory leak. The leak occurs in the case when a storage device does not have a PCI parent. > > > --- > > qga/commands-win32.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/qga/commands-win32.c b/qga/commands-win32.c > > index 724ce76a0e..a8a601776d 100644 > > --- a/qga/commands-win32.c > > +++ b/qga/commands-win32.c > > @@ -539,9 +539,9 @@ static GuestPCIAddress *get_pci_info(int number, > Error **errp) > > dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA); > > dev_iface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); > > for (i = 0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); > i++) { > > - PSP_DEVICE_INTERFACE_DETAIL_DATA pdev_iface_detail_data = NULL; > > + g_autofree PSP_DEVICE_INTERFACE_DETAIL_DATA > pdev_iface_detail_data = NULL; > > STORAGE_DEVICE_NUMBER sdn; > > - char *parent_dev_id = NULL; > > + g_autofree char *parent_dev_id = NULL; > > HDEVINFO parent_dev_info; > > SP_DEVINFO_DATA parent_dev_info_data; > > DWORD j; > > > > Anyhow this function is confuse. > > I think it would be easier to review by replacing the while() > by 2 calls, as suggested in the documentation: > > https://docs.microsoft.com/en-us/windows/win32/api/setupapi/nf-setupapi-setupdigetdeviceinterfacedetaila > > Ok. I will refactor these patches. > -- >8 -- > diff --git a/qga/commands-win32.c b/qga/commands-win32.c > index 7bac0c5d422..2188c5dd80d 100644 > --- a/qga/commands-win32.c > +++ b/qga/commands-win32.c > @@ -539,7 +539,6 @@ static GuestPCIAddress *get_pci_info(int number, > Error **errp) > dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA); > dev_iface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); > for (i = 0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) { > - PSP_DEVICE_INTERFACE_DETAIL_DATA pdev_iface_detail_data = NULL; > STORAGE_DEVICE_NUMBER sdn; > char *parent_dev_id = NULL; > HDEVINFO parent_dev_info; > @@ -551,25 +550,36 @@ static GuestPCIAddress *get_pci_info(int number, > Error **errp) > if (SetupDiEnumDeviceInterfaces(dev_info, &dev_info_data, > &GUID_DEVINTERFACE_DISK, 0, > &dev_iface_data)) { > - while (!SetupDiGetDeviceInterfaceDetail(dev_info, > &dev_iface_data, > - > pdev_iface_detail_data, > - size, &size, > - &dev_info_data)) { > - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { > - pdev_iface_detail_data = g_malloc(size); > - pdev_iface_detail_data->cbSize = > - sizeof(*pdev_iface_detail_data); > - } else { > - error_setg_win32(errp, GetLastError(), > - "failed to get device interfaces"); > - goto free_dev_info; > - } > + g_autofree PSP_DEVICE_INTERFACE_DETAIL_DATA > + pdev_iface_detail_data = NULL; > + > + /* Get the required buffer size. */ > + if (!SetupDiGetDeviceInterfaceDetail(dev_info, > &dev_iface_data, > + NULL, 0, &size, > + &dev_info_data) > + && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { > + error_setg_win32(errp, GetLastError(), > + "failed to get device interfaces > buffer size"); > + goto free_dev_info; > + } > + > + /* Allocate an appropriately sized buffer. */ > + pdev_iface_detail_data = g_malloc(size); > + pdev_iface_detail_data->cbSize = > sizeof(*pdev_iface_detail_data); > + > + /* Get the interface details. */ > + if (!SetupDiGetDeviceInterfaceDetail(dev_info, > &dev_iface_data, > + pdev_iface_detail_data, > + size, &size, > + &dev_info_data)) { > + error_setg_win32(errp, GetLastError(), > + "failed to get device interfaces"); > + goto free_dev_info; > } > > dev_file = CreateFile(pdev_iface_detail_data->DevicePath, 0, > FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, > NULL); > - g_free(pdev_iface_detail_data); > > if (!DeviceIoControl(dev_file, > IOCTL_STORAGE_GET_DEVICE_NUMBER, > NULL, 0, &sdn, sizeof(sdn), &size, > NULL)) { > --- > >