From 7cc9455fe1b8a6194f52062c90761fffa6ae6fdc Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Wed, 7 Jun 2017 23:05:37 +0300
Subject: MAINT-6697 Correct pointer freeing

---
 indra/llcommon/llsdserialize.cpp | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index 0568a639a0..3a219eb998 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -2091,13 +2091,18 @@ std::string zip_llsd(LLSD& data)
 			}
 
 			have = CHUNK-strm.avail_out;
-			output = (U8*) realloc(output, cur_size+have);
-			if (output == NULL)
+			U8* new_output = (U8*) realloc(output, cur_size+have);
+			if (new_output == NULL)
 			{
 				LL_WARNS() << "Failed to compress LLSD block: can't reallocate memory, current size: " << cur_size << " bytes; requested " << cur_size + have << " bytes." << LL_ENDL;
 				deflateEnd(&strm);
+				if (output)
+				{
+					free(output);
+				}
 				return std::string();
 			}
+			output = new_output;
 			memcpy(output+cur_size, out, have);
 			cur_size += have;
 		}
@@ -2180,14 +2185,19 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)
 
 		U32 have = CHUNK-strm.avail_out;
 
-		result = (U8*) realloc(result, cur_size + have);
-		if (result == NULL)
+		U8* new_result = (U8*)realloc(result, cur_size + have);
+		if (new_result == NULL)
 		{
 			LL_WARNS() << "Failed to unzip LLSD block: can't reallocate memory, current size: " << cur_size << " bytes; requested " << cur_size + have << " bytes." << LL_ENDL;
 			inflateEnd(&strm);
+			if (result)
+			{
+				free(result);
+			}
 			delete[] in;
 			return false;
 		}
+		result = new_result;
 		memcpy(result+cur_size, out, have);
 		cur_size += have;
 
@@ -2279,15 +2289,20 @@ U8* unzip_llsdNavMesh( bool& valid, unsigned int& outsize, std::istream& is, S32
 
 		U32 have = CHUNK-strm.avail_out;
 
-		result = (U8*) realloc(result, cur_size + have);
-		if (result == NULL)
+		U8* new_result = (U8*) realloc(result, cur_size + have);
+		if (new_result == NULL)
 		{
 			LL_WARNS() << "Failed to unzip LLSD NavMesh block: can't reallocate memory, current size: " << cur_size << " bytes; requested " << cur_size + have << " bytes." << LL_ENDL;
 			inflateEnd(&strm);
+			if (result)
+			{
+				free(result);
+			}
 			delete[] in;
 			valid = false;
 			return NULL;
 		}
+		result = new_result;
 		memcpy(result+cur_size, out, have);
 		cur_size += have;
 
-- 
cgit v1.2.3