[libvirt] [PATCH] esx: Fix dynamic dispatch for CastFromAnyType functions
Matthias Bolte
matthias.bolte at googlemail.com
Wed Apr 27 07:35:32 UTC 2011
2011/4/27 Daniel Veillard <veillard at redhat.com>:
> On Mon, Apr 25, 2011 at 01:32:43PM +0200, Matthias Bolte wrote:
>> 2011/4/25 Matthias Bolte <matthias.bolte at googlemail.com>:
>> > This was broken by the refactoring in ac1e6586ec75. It resulted in a
>> > segfault for 'virsh vol-dumpxml' and related volume functions.
>> >
>>
>> Actually that patch doesn't fix the problem correctly. It just turns
>> the segfault into an error message.
>>
>> Here's v2 that really fixes the problem. Note the important difference
>> between anyType->_type and anyType->type :)
>>
>> Matthias
>
>> From a17245fb92c88439ffbb84e34bebf1afb6903885 Mon Sep 17 00:00:00 2001
>> From: Matthias Bolte <matthias.bolte at googlemail.com>
>> Date: Mon, 25 Apr 2011 12:38:17 +0200
>> Subject: [PATCH] esx: Fix dynamic dispatch for CastFromAnyType functions
>>
>> This was broken by the refactoring in ac1e6586ec75. It resulted in a
>> segfault for 'virsh vol-dumpxml' and related volume functions.
>>
>> Before the refactoring all users of the ESX_VI__TEMPLATE__DISPATCH
>> macro dispatched on the item type, as the item is the input to all those
>> functions.
>>
>> Commit ac1e6586ec75 made the dynamically dispatched CastFromAnyType
>> functions use this macro too, but this functions dispatched on the
>> actual type of the AnyType object. The item is the output of the
>> CastFromAnyType functions.
>>
>> This difference was missed in the refactoring, making CastFromAnyType
>> functions dereferencing the item pointer that is NULL at the time of
>> the dispatch.
>> ---
>> src/esx/esx_vi_types.c | 14 ++++++++------
>> 1 files changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c
>> index dd83954..3c81021 100644
>> --- a/src/esx/esx_vi_types.c
>> +++ b/src/esx/esx_vi_types.c
>> @@ -533,8 +533,9 @@
>> * Macros to implement dynamic dispatched functions
>> */
>>
>> -#define ESX_VI__TEMPLATE__DISPATCH(__type, _dispatch, _error_return) \
>> - switch (item->_type) { \
>> +#define ESX_VI__TEMPLATE__DISPATCH(_actual_type, __type, _dispatch, \
>> + _error_return) \
>> + switch (_actual_type) { \
>> _dispatch \
>> \
>> case esxVI_Type_##__type: \
>> @@ -543,7 +544,7 @@
>> default: \
>> ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, \
>> _("Call to %s for unexpected type '%s'"), __FUNCTION__, \
>> - esxVI_Type_ToString(item->_type)); \
>> + esxVI_Type_ToString(_actual_type)); \
>> return _error_return; \
>> }
>>
>> @@ -585,7 +586,8 @@
>>
>> #define ESX_VI__TEMPLATE__DYNAMIC_FREE(__type, _dispatch, _body) \
>> ESX_VI__TEMPLATE__FREE(__type, \
>> - ESX_VI__TEMPLATE__DISPATCH(__type, _dispatch, /* nothing */) \
>> + ESX_VI__TEMPLATE__DISPATCH(item->_type, __type, _dispatch, \
>> + /* nothing */) \
>> _body)
>>
>>
>> @@ -618,14 +620,14 @@
>>
>> #define ESX_VI__TEMPLATE__DYNAMIC_CAST_FROM_ANY_TYPE(__type, _dispatch) \
>> ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE_EXTRA(__type, esxVI_##__type, \
>> - ESX_VI__TEMPLATE__DISPATCH(__type, _dispatch, -1), \
>> + ESX_VI__TEMPLATE__DISPATCH(anyType->type, __type, _dispatch, -1), \
>> /* nothing */)
>>
>>
>>
>> #define ESX_VI__TEMPLATE__DYNAMIC_SERIALIZE(__type, _dispatch, _serialize) \
>> ESX_VI__TEMPLATE__SERIALIZE_EXTRA(__type, \
>> - ESX_VI__TEMPLATE__DISPATCH(__type, _dispatch, -1), \
>> + ESX_VI__TEMPLATE__DISPATCH(item->_type, __type, _dispatch, -1), \
>> _serialize)
>>
>
> Not sure I fully understand but looks regular and okay, ACK :-)
>
> Daniel
>
Actually, this shows that even I'm not always aware of all the details
in the ESX driver, otherwise this regression fix wouldn't have be
necessary and I wouldn't have needed two attempts to get it right. So
don't feel too bad about not fully understanding it :)
This is probably a sign that I should try to reduce the complexity and
levels of indirection in the generated code and the code generator.
Thanks, finally pushed v2.
Matthias
More information about the libvir-list
mailing list