Index: ext/libicpf/src/config_property.cpp
===================================================================
diff -u -rd5bb2e19e22f57bd018e9db355108b54dfbc364c -r9bdff2e0b309af11014634d8c38367e4f6b656e3
--- ext/libicpf/src/config_property.cpp	(.../config_property.cpp)	(revision d5bb2e19e22f57bd018e9db355108b54dfbc364c)
+++ ext/libicpf/src/config_property.cpp	(.../config_property.cpp)	(revision 9bdff2e0b309af11014634d8c38367e4f6b656e3)
@@ -30,8 +30,11 @@
 	m_uiPropType(uiType),
 	m_pszName(NULL)
 {
+	memset(&m_val, 0, sizeof(_VALUE));
+	memset(&m_range, 0, sizeof(_RANGE));
+
 	// init
-	init(pszName, uiType);
+	init(pszName, uiType, false);
 }
 
 /** Constructs a property object based on some other property object.
@@ -40,7 +43,7 @@
  */
 property::property(const property& src)
 {
-	operator=(src);
+	copy_from(src, false);
 }
 
 /** Destructs the property object.
@@ -58,71 +61,8 @@
 property& property::operator=(const property& rSrc)
 {
 	if (this != &rSrc)
-	{
-		// clear values in this class
-		clear_value();
+		copy_from(rSrc, true);
 
-		// copy the value(s)
-		if (rSrc.m_uiPropType & flag_array)
-		{
-			// source property is an array
-			switch(rSrc.m_uiPropType & mask_type)
-			{
-			case type_string:
-				m_val.hArray=new std::vector<tstring>(*(std::vector<tstring>*)rSrc.m_val.hArray);
-				break;
-			case type_signed_num:
-				m_val.hArray=new std::vector<ll_t>(*(std::vector<ll_t>*)rSrc.m_val.hArray);
-				break;
-			case type_unsigned_num:
-				m_val.hArray=new std::vector<ull_t>(*(std::vector<ull_t>*)rSrc.m_val.hArray);
-				break;
-			case type_bool:
-				m_val.hArray=new std::vector<bool>(*(std::vector<bool>*)rSrc.m_val.hArray);
-				break;
-			default:
-				assert(false);	// unknown property type
-			}
-		}
-		else
-		{
-			// source property is normal value
-			switch(rSrc.m_uiPropType & mask_type)
-			{
-			case type_string:
-				{
-					m_val.pszVal=copy_string(rSrc.m_val.pszVal);
-					break;
-				}
-			case type_signed_num:
-				{
-					m_val.llVal=rSrc.m_val.llVal;
-					m_range.ll.llHi=rSrc.m_range.ll.llHi;
-					m_range.ll.llLo=rSrc.m_range.ll.llLo;
-					break;
-				}
-			case type_unsigned_num:
-				{
-					m_val.ullVal=rSrc.m_val.ullVal;
-					m_range.ull.ullHi=rSrc.m_range.ull.ullHi;
-					m_range.ull.ullLo=rSrc.m_range.ull.ullLo;
-					break;
-				}
-			case type_bool:
-				{
-					m_val.bVal=rSrc.m_val.bVal;
-					break;
-				}
-			default:
-				assert(false);		// property type not implemented?
-			}
-		}
-
-		// copy values
-		m_uiPropType=rSrc.m_uiPropType;
-		m_pszName=copy_string(rSrc.m_pszName);
-	}
-
 	return *this;
 }
 
@@ -973,4 +913,76 @@
 #endif
 }
 
+/** Function makes a copy of a given property storing it in this one.
+ *
+ * \param[in] rSrc - property to copy from
+ * \param[in] bClear - should we cleat current contents first
+ */
+void property::copy_from(const property& rSrc, bool bClear)
+{
+	// clear values in this class
+	if (bClear)
+		clear_value();
+
+	// copy the value(s)
+	if (rSrc.m_uiPropType & flag_array)
+	{
+		// source property is an array
+		switch(rSrc.m_uiPropType & mask_type)
+		{
+		case type_string:
+			m_val.hArray=new std::vector<tstring>(*(std::vector<tstring>*)rSrc.m_val.hArray);
+			break;
+		case type_signed_num:
+			m_val.hArray=new std::vector<ll_t>(*(std::vector<ll_t>*)rSrc.m_val.hArray);
+			break;
+		case type_unsigned_num:
+			m_val.hArray=new std::vector<ull_t>(*(std::vector<ull_t>*)rSrc.m_val.hArray);
+			break;
+		case type_bool:
+			m_val.hArray=new std::vector<bool>(*(std::vector<bool>*)rSrc.m_val.hArray);
+			break;
+		default:
+			assert(false);	// unknown property type
+		}
+	}
+	else
+	{
+		// source property is normal value
+		switch(rSrc.m_uiPropType & mask_type)
+		{
+		case type_string:
+			{
+				m_val.pszVal=copy_string(rSrc.m_val.pszVal);
+				break;
+			}
+		case type_signed_num:
+			{
+				m_val.llVal=rSrc.m_val.llVal;
+				m_range.ll.llHi=rSrc.m_range.ll.llHi;
+				m_range.ll.llLo=rSrc.m_range.ll.llLo;
+				break;
+			}
+		case type_unsigned_num:
+			{
+				m_val.ullVal=rSrc.m_val.ullVal;
+				m_range.ull.ullHi=rSrc.m_range.ull.ullHi;
+				m_range.ull.ullLo=rSrc.m_range.ull.ullLo;
+				break;
+			}
+		case type_bool:
+			{
+				m_val.bVal=rSrc.m_val.bVal;
+				break;
+			}
+		default:
+			assert(false);		// property type not implemented?
+		}
+	}
+
+	// copy values
+	m_uiPropType=rSrc.m_uiPropType;
+	m_pszName=copy_string(rSrc.m_pszName);
+}
+
 END_ICPF_NAMESPACE