[libvirt] [PATCH v7 3/6] hyperv: add hypervInvokeMethod

Sri Ramanujam sramanujam at datto.com
Wed Jul 19 12:13:57 UTC 2017


Just tested this patch quickly, and it causes invalid free()s when the
codepath is invoked against a Hyper-V 2008 system, and causes the
operation to fail (but does not crash virsh) against Hyper-V 2012. I'm
away from my usual setup atm (on vacation), so I can help look into
this further next week when I'm back.

On Wed, Jul 19, 2017 at 1:21 AM, Matthias Bolte
<matthias.bolte at googlemail.com> wrote:
> 2017-07-18 18:54 GMT+02:00 Andrea Bolognani <abologna at redhat.com>:
>> On Tue, 2017-06-27 at 15:13 -0400, Sri Ramanujam wrote:
>>> This commit adds support for invoking methods on remote objects
>>> via hypervInvokeMethod.
>>> ---
>>>  src/hyperv/hyperv_wmi.c | 590 ++++++++++++++++++++++++++++++++++++++++++++++++
>>>  src/hyperv/hyperv_wmi.h |   8 +-
>>>  src/hyperv/openwsman.h  |   4 +
>>>  3 files changed, 600 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/src/hyperv/hyperv_wmi.c b/src/hyperv/hyperv_wmi.c
>>> index 2732db3..f944b14 100644
>>> --- a/src/hyperv/hyperv_wmi.c
>>> +++ b/src/hyperv/hyperv_wmi.c
>> [...]
>>> +static int
>>> +hypervSerializeEprParam(hypervParamPtr p, hypervPrivate *priv,
>>> +        const char *resourceUri, WsXmlDocH doc, WsXmlNodeH *methodNode)
>>> +{
>>> +    int result = -1;
>>> +    WsXmlNodeH xmlNodeParam = NULL,
>>> +               xmlNodeTemp = NULL,
>>> +               xmlNodeAddr = NULL,
>>> +               xmlNodeRef = NULL;
>>> +    xmlNodePtr xmlNodeAddrPtr = NULL,
>>> +               xmlNodeRefPtr = NULL;
>> [...]
>>> +    if (!(xmlNodeAddrPtr = xmlDocCopyNode((xmlNodePtr) xmlNodeAddr, docPtr, 1))) {
>>
>> Here you're casting a WsXmlNodeH to a xmlNodePtr, and clang
>> doesn't like it one bit:
>>
>>   hyperv/hyperv_wmi.c:576:43: error:
>>     cast from 'WsXmlNodeH' (aka 'struct __WsXmlNode *')
>>     to 'xmlNodePtr' (aka 'struct _xmlNode *')
>>     increases required alignment from 4 to 8
>>     [-Werror,-Wcast-align]
>>
>> Any idea how to unbreak it?
>
> The problem here is that the driver is mixing direct libxml2 calls
> with calls to the libxml2 wrapper of openwsman. The openwsman wrapper
> type WsXmlNodeH is actually a xmlNodePtr, but that is hidden to the
> compiler.
>
> I checked if the openwsman libxml2 wrapper is complete enough to get
> rid of this API mixing. I could replace all direct libxml2 calls with
> openwsman wrapper call except xmlNewCDataBlock. A hack for this last
> offender is to cast to a void pointer first, instead of a direct cast.
> See attached patch for a quick fix, compile-tested only.
>
> Another possibility is to do all the XML building using direct libxml2
> calls, format the XML document and reparse it with the openwsman
> wrapper. But I don't have time to work on that at the moment.
>
> --
> Matthias Bolte
> http://photron.blogspot.com



-- 
Sri Ramanujam
Software Engineer
Datto, Inc.




More information about the libvir-list mailing list