[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 4/5] gqa-win: get_pci_info: Replace 'while' with 2 calls of t
From: |
Marc-André Lureau |
Subject: |
Re: [PATCH 4/5] gqa-win: get_pci_info: Replace 'while' with 2 calls of the function |
Date: |
Mon, 13 Dec 2021 23:45:36 +0400 |
On Mon, Dec 13, 2021 at 3:16 PM Kostiantyn Kostiuk
<konstantin@daynix.com> wrote:
>
> Microsoft suggests this solution in the documentation:
> https://docs.microsoft.com/en-us/windows/win32/api/setupapi/nf-setupapi-setupdigetdeviceinterfacedetaila
>
> Signed-off-by: Kostiantyn Kostiuk <kkostiuk@redhat.com>
> Signed-off-by: Kostiantyn Kostiuk <konstantin@daynix.com>
Arguably, the next patch should come first, as you introduce extra
leaking points here - alternatively, update the commit message.
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> qga/commands-win32.c | 30 ++++++++++++++++++++++++------
> 1 file changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/qga/commands-win32.c b/qga/commands-win32.c
> index cef14a8762..6bde5260e8 100644
> --- a/qga/commands-win32.c
> +++ b/qga/commands-win32.c
> @@ -552,10 +552,10 @@ 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 (!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 =
> @@ -567,6 +567,16 @@ static GuestPCIAddress *get_pci_info(int number, Error
> **errp)
> }
> }
>
> + if (!SetupDiGetDeviceInterfaceDetail(dev_info, &dev_iface_data,
> + pdev_iface_detail_data,
> + size, &size,
> + &dev_info_data)) {
> + // pdev_iface_detail_data already is allocated
> + error_setg_win32(errp, GetLastError(),
> + "failed to get device interfaces");
> + goto cleanup;
> + }
> +
> dev_file = CreateFile(pdev_iface_detail_data->DevicePath, 0,
> FILE_SHARE_READ, NULL, OPEN_EXISTING, 0,
> NULL);
> @@ -597,8 +607,8 @@ static GuestPCIAddress *get_pci_info(int number, Error
> **errp)
> ULONG dev_id_size = 0;
>
> size = 0;
> - while (!SetupDiGetDeviceInstanceId(dev_info, &dev_info_data,
> - parent_dev_id, size, &size)) {
> + if (!SetupDiGetDeviceInstanceId(dev_info, &dev_info_data,
> + parent_dev_id, size, &size)) {
> if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
> parent_dev_id = g_malloc(size);
> } else {
> @@ -608,6 +618,14 @@ static GuestPCIAddress *get_pci_info(int number, Error
> **errp)
> }
> }
>
> + if (!SetupDiGetDeviceInstanceId(dev_info, &dev_info_data,
> + parent_dev_id, size, &size)) {
> + // parent_dev_id already is allocated
> + error_setg_win32(errp, GetLastError(),
> + "failed to get device instance ID");
> + goto cleanup;
> + }
> +
> /*
> * CM API used here as opposed to
> * SetupDiGetDeviceProperty(..., DEVPKEY_Device_Parent, ...)
> --
> 2.25.1
>
- [PATCH 0/5] gqa-win: get_pci_info: Fix memory leak, Kostiantyn Kostiuk, 2021/12/13
- [PATCH 3/5] gqa-win: get_pci_info: Free parent_dev_info properly, Kostiantyn Kostiuk, 2021/12/13
- [PATCH 4/5] gqa-win: get_pci_info: Replace 'while' with 2 calls of the function, Kostiantyn Kostiuk, 2021/12/13
- Re: [PATCH 4/5] gqa-win: get_pci_info: Replace 'while' with 2 calls of the function,
Marc-André Lureau <=
- [PATCH 1/5] gqa-win: get_pci_info: Clean dev_info if handle is valid, Kostiantyn Kostiuk, 2021/12/13
- [PATCH 5/5] gqa-win: get_pci_info: Add g_autofree for few variables, Kostiantyn Kostiuk, 2021/12/13
- [PATCH 2/5] gqa-win: get_pci_info: Use common 'cleanup' label, Kostiantyn Kostiuk, 2021/12/13