[libvirt] [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 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c index 8750554..36f3196 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; \ + } -- 1.7.4.1

On 05.08.2012 10:38, Matthias Bolte wrote:
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 files changed, 30 insertions(+), 5 deletions(-)
ACK Michal

2012/8/6 Michal Privoznik <mprivozn@redhat.com>:
On 05.08.2012 10:38, Matthias Bolte wrote:
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 files changed, 30 insertions(+), 5 deletions(-)
ACK
Thanks, pushed. -- Matthias Bolte http://photron.blogspot.com
participants (2)
-
Matthias Bolte
-
Michal Privoznik