[libvirt] [PATCH v2 1/2] vbox: change how vbox API is initialized.

John Ferlan jferlan at redhat.com
Wed Nov 23 16:48:50 UTC 2016



On 11/23/2016 11:33 AM, Dawid Zamirski wrote:
> On Wed, 2016-11-23 at 11:00 -0500, Dawid Zamirski wrote:
>> On Wed, 2016-11-23 at 08:55 -0500, John Ferlan wrote:
>>> [...]
>>>> +
>>>> +static vboxDriverPtr
>>>> +vboxGetDriverConnection(void)
>>>> +{
>>>> +    virMutexLock(&vbox_driver_lock);
>>>> +
>>>> +    if (vbox_driver) {
>>>> +        virObjectRef(vbox_driver);
>>>> +    } else {
>>>> +        vbox_driver = vboxDriverObjNew();
>>>> +
>>>> +        if (!vbox_driver) {
>>>> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>>>> +                           _("Failed to create vbox driver
>>>> object."));
>>>> +            return NULL;
>>>> +        }
>>>> +    }
>>>> +
>>>> +    if (vboxSdkInitialize() < 0 || vboxExtractVersion() < 0) {
>>>
>>> In this path should vboxSdkUninitialize be called (since it
>>> wouldn't
>>> be
>>> called in the destroy path)?
>>
>> If vboxSdkUnintialize fails, VBoxSVC is not started so it does not
>> need
>> to be unintialized - which is in line with the sample code included
>> SDK
>> where it returns with EXIT_FAILUE in main if pfnClientInifialize
>> fails.
>> However, if vboxExtractVersion fails (unlikely) we might want to call
>> gVBoxAPI.UPFN.Unintialize(vbox_driver) directly (not via
>> vboxSdkUninitialize as it checks connectionCount > 0 which on failure
>> would be 0). I've just tested both cases with
>> gVBoxAPI.UPFN.Unintialize
>> in the failure path, and calling it does not do any harm in both
>> cases,
>> so I guess it would be a good idea to put it there.
>>
> 
> Actually, I was wrong in that it's safe to call
> gVBoxAPI.UPFN.Unintialize when vboxSdkInitialize fails - I got segfault
> when attempting to connect twice in VBOX_RELEASE(data->vboxObject).
> It's safe to do this though:
> 
>     if (vboxSdkInitialize() < 0) {
>         virObjectUnref(vbox_driver);
>         virMutexUnlock(&vbox_driver_lock);
> 
>         return NULL;
>     }
> 
>     if (vboxExtractVersion() < 0) {
>         gVBoxAPI.UPFN.Uninitialize(vbox_driver);
>         virObjectUnref(vbox_driver);
>         virMutexUnlock(&vbox_driver_lock);
> 
>         return NULL;
>     }
>  
> i.e do not uninitalize on initialize failure, but do unintialize on
> vboxExractVersion failure.
> 

Fair enough - what about the 4 places in vboxSdkInitialize that return
failure after gVBoxAPI.UPFN.Initialize is successful?

John

FWIW: A closer look at vboxExtractVersion made me realize the "normal"
fall through code path goes through the 'failed:' label, which looks odd.




More information about the libvir-list mailing list