[libvirt] [PATCH] parallels: Cleanup partly opened drivers on connect open failure

Maxim Nestratov mnestratov at parallels.com
Wed Mar 4 08:52:34 UTC 2015


26.02.2015 19:29, Michal Privoznik пишет:
> Well, the parallelsConnectOpen() joins several sub-driver openings
> into one big if condition. If any of sub-driver fails to open, the
> whole API finishes immediately. The problem is, sub-drivers may have
> left some memory allocated. Fortunately, we have a free function for
> that: parallelsConnectClose(). This is, however, not prepared for
> partially allocated driver structure. So, prepare the free function
> for it and call it at the right place, in the if body.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>
> This commit assumes that virNetworkObjListFree() accepts NULL,
> and thus depends on this patch (which has been ACKed already):
>
> https://www.redhat.com/archives/libvir-list/2015-February/msg01127.html
>
> Should I push both during freeze or wait until after the release?
>
>   src/parallels/parallels_driver.c  | 7 ++++++-
>   src/parallels/parallels_network.c | 4 ++++
>   src/parallels/parallels_storage.c | 6 ++++++
>   3 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
> index c9338b5..650b790 100644
> --- a/src/parallels/parallels_driver.c
> +++ b/src/parallels/parallels_driver.c
> @@ -264,8 +264,10 @@ parallelsConnectOpen(virConnectPtr conn,
>   
>       if ((ret = parallelsOpenDefault(conn)) != VIR_DRV_OPEN_SUCCESS ||
>           (ret = parallelsStorageOpen(conn, flags)) != VIR_DRV_OPEN_SUCCESS ||
> -        (ret = parallelsNetworkOpen(conn, flags)) != VIR_DRV_OPEN_SUCCESS)
> +        (ret = parallelsNetworkOpen(conn, flags)) != VIR_DRV_OPEN_SUCCESS) {
> +        parallelsConnectClose(conn);
>           return ret;
> +    }
>   
>       return VIR_DRV_OPEN_SUCCESS;
>   }
> @@ -275,6 +277,9 @@ parallelsConnectClose(virConnectPtr conn)
>   {
>       parallelsConnPtr privconn = conn->privateData;
>   
> +    if (!privconn)
> +        return 0;
> +
>       parallelsNetworkClose(conn);
>       parallelsStorageClose(conn);
>   
> diff --git a/src/parallels/parallels_network.c b/src/parallels/parallels_network.c
> index 3e7087d..c5834c5 100644
> --- a/src/parallels/parallels_network.c
> +++ b/src/parallels/parallels_network.c
> @@ -336,6 +336,10 @@ parallelsNetworkOpen(virConnectPtr conn,
>   int parallelsNetworkClose(virConnectPtr conn)
>   {
>       parallelsConnPtr privconn = conn->privateData;
> +
> +    if (!privconn)
> +        return 0;
> +
>       parallelsDriverLock(privconn);
>       virNetworkObjListFree(&privconn->networks);
>       parallelsDriverUnlock(privconn);
> diff --git a/src/parallels/parallels_storage.c b/src/parallels/parallels_storage.c
> index d2c5bf2..56c1b42 100644
> --- a/src/parallels/parallels_storage.c
> +++ b/src/parallels/parallels_storage.c
> @@ -72,9 +72,15 @@ parallelsStorageClose(virConnectPtr conn)
>   {
>       parallelsConnPtr privconn = conn->privateData;
>   
> +    if (!privconn)
> +        return 0;
> +
>       virStorageDriverStatePtr storageState = privconn->storageState;
>       privconn->storageState = NULL;
>   
> +    if (!storageState)
> +        return 0;
> +
>       parallelsStorageLock(storageState);
>       virStoragePoolObjListFree(&privconn->pools);
>       VIR_FREE(storageState->configDir);
Ack and thank you.




More information about the libvir-list mailing list