[PATCH] esx: Fix dynamic deep copy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]