From c10cc254702816a00a8e7404b708996c853e00ed Mon Sep 17 00:00:00 2001 From: Matthias Bolte Date: Sat, 4 Aug 2012 19:56:17 +0200 Subject: [PATCH] esx: Fix dynamic deep copy The static deep copy allocates storage for the copy. The dynamic version injected the dynamic dispatch after the allocation. This triggered the invalid argument check in the dynamically dispatched deep copy call. The deep copy function expects its dest parameter to be a pointer to a NULL-pointer. This expectation wasn't met due to the dispatching deep copy doing the allocation before the call. Fix this by dynamically dispatching to the correct type before the allocation. --- src/esx/esx_vi_types.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c index 87505544aa..36f31964a9 100644 --- a/src/esx/esx_vi_types.c +++ b/src/esx/esx_vi_types.c @@ -621,11 +621,36 @@ #define ESX_VI__TEMPLATE__DYNAMIC_DEEP_COPY(__type, _dispatch, _deep_copy) \ - ESX_VI__TEMPLATE__DEEP_COPY(__type, \ - ESX_VI__TEMPLATE__DISPATCH(src->_type, \ - esxVI_Type_ToString(src->_type), \ - __type, _dispatch, -1) \ - _deep_copy) + int \ + esxVI_##__type##_DeepCopy(esxVI_##__type **dest, esxVI_##__type *src) \ + { \ + if (dest == NULL || *dest != NULL) { \ + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", \ + _("Invalid argument")); \ + return -1; \ + } \ + \ + if (src == NULL) { \ + return 0; \ + } \ + \ + ESX_VI__TEMPLATE__DISPATCH(src->_type, \ + esxVI_Type_ToString(src->_type), \ + __type, _dispatch, -1) \ + \ + if (esxVI_##__type##_Alloc(dest) < 0) { \ + goto failure; \ + } \ + \ + _deep_copy \ + \ + return 0; \ + \ + failure: \ + esxVI_##__type##_Free(dest); \ + \ + return -1; \ + } -- 2.47.2