From 76023f172c2a8eeb5c8d6b55119ef3e8faf8cc6f Mon Sep 17 00:00:00 2001
From: Stinson Linden <stinson@lindenlab.com>
Date: Wed, 14 May 2014 22:55:19 +0100
Subject: [PATCH] MAINT-4009: Patching a leak of LLVisualParam derived objects
 that were being leaked because the LLWearable class was not destroying itself
 properly.

---
 indra/llappearance/llwearable.cpp   |  8 ++++++++
 indra/llcharacter/llvisualparam.cpp | 13 ++++++++++++-
 indra/llcharacter/llvisualparam.h   |  1 +
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/indra/llappearance/llwearable.cpp b/indra/llappearance/llwearable.cpp
index 6749a85f3cb..d064b2982c0 100644
--- a/indra/llappearance/llwearable.cpp
+++ b/indra/llappearance/llwearable.cpp
@@ -60,6 +60,14 @@ LLWearable::LLWearable()
 // virtual
 LLWearable::~LLWearable()
 {
+	for (visual_param_index_map_t::iterator vpIter = mVisualParamIndexMap.begin(); vpIter != mVisualParamIndexMap.end(); ++vpIter)
+	{
+		LLVisualParam* vp = vpIter->second;
+		vp->clearNextParam();
+		delete vp;
+		vpIter->second = NULL;
+	}
+
 	destroyTextures();
 }
 
diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp
index 0df7fb2bc3c..dd87847c186 100755
--- a/indra/llcharacter/llvisualparam.cpp
+++ b/indra/llcharacter/llvisualparam.cpp
@@ -178,7 +178,10 @@ LLVisualParam::LLVisualParam()
 //-----------------------------------------------------------------------------
 LLVisualParam::~LLVisualParam()
 {
-	delete mNext;
+	if (mNext != NULL)
+	{
+		delete mNext;
+	}
 }
 
 /*
@@ -284,6 +287,14 @@ void LLVisualParam::setNextParam( LLVisualParam *next )
 	mNext = next;
 }
 
+//-----------------------------------------------------------------------------
+// clearNextParam()
+//-----------------------------------------------------------------------------
+void LLVisualParam::clearNextParam()
+{
+	mNext = NULL;
+}
+
 //-----------------------------------------------------------------------------
 // animate()
 //-----------------------------------------------------------------------------
diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h
index a4d9f93e56f..78c776705ff 100755
--- a/indra/llcharacter/llvisualparam.h
+++ b/indra/llcharacter/llvisualparam.h
@@ -155,6 +155,7 @@ class LLVisualParam
 
 	LLVisualParam*			getNextParam()		{ return mNext; }
 	void					setNextParam( LLVisualParam *next );
+	void					clearNextParam();
 	
 	virtual void			setAnimating(BOOL is_animating) { mIsAnimating = is_animating && !mIsDummy; }
 	BOOL					getAnimating() const { return mIsAnimating; }
-- 
GitLab