From 8167360f47fb5284451f3b1cc30f5dd3018cc9e9 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 22 Sep 2017 15:09:14 +0200 Subject: [PATCH] feat(c-wrapper): setCppPtrFromC is now more secure --- src/c-wrapper/internal/c-tools.h | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/c-wrapper/internal/c-tools.h b/src/c-wrapper/internal/c-tools.h index 4ccea66b6..26694d757 100644 --- a/src/c-wrapper/internal/c-tools.h +++ b/src/c-wrapper/internal/c-tools.h @@ -123,21 +123,27 @@ public: return reinterpret_cast *>(cObject)->cppPtr; } - template - static inline void setCppPtrFromC (void *cObject, const std::shared_ptr &cppObject) { + template< + typename CppType, + typename = typename std::enable_if::value, CppType>::type + > + static inline void setCppPtrFromC (void *cObject, const std::shared_ptr &cppObject) { L_ASSERT(cObject); - static_cast *>(cObject)->cppPtr = cppObject; + static_cast *>(cObject)->cppPtr = cppObject; cppObject->setProperty("LinphonePrivate::Wrapper::cBackPtr", cObject); } - template - static inline void setCppPtrFromC (void *cObject, const T *cppObject) { + template< + typename CppType, + typename = typename std::enable_if::value, CppType>::type + > + static inline void setCppPtrFromC (void *cObject, const CppType *cppObject) { L_ASSERT(cObject); - T *oldPtr = reinterpret_cast(static_cast *>(cObject)->cppPtr); + CppType *oldPtr = reinterpret_cast(static_cast *>(cObject)->cppPtr); if (oldPtr != cppObject) { delete oldPtr; - T **cppPtr = &static_cast *>(cObject)->cppPtr; - *cppPtr = new T(*cppObject); + CppType **cppPtr = &static_cast *>(cObject)->cppPtr; + *cppPtr = new CppType(*cppObject); (*cppPtr)->setProperty("LinphonePrivate::Wrapper::cBackPtr", cObject); } } @@ -429,8 +435,8 @@ LINPHONE_END_NAMESPACE >(C_OBJECT) // Set the cpp-ptr of a wrapped C object. -#define L_SET_CPP_PTR_FROM_C_OBJECT(C_OBJECT, CPP_PTR) \ - LINPHONE_NAMESPACE::Wrapper::setCppPtrFromC(C_OBJECT, CPP_PTR) +#define L_SET_CPP_PTR_FROM_C_OBJECT(C_OBJECT, CPP_OBJECT) \ + LINPHONE_NAMESPACE::Wrapper::setCppPtrFromC(C_OBJECT, CPP_OBJECT) // Get the private data of a shared or simple cpp-ptr. #define L_GET_PRIVATE(CPP_OBJECT) \