On Mon, Apr 25, 2011 at 01:32:43PM +0200, Matthias Bolte wrote:
2011/4/25 Matthias Bolte <matthias.bolte(a)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(a)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
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/