From 41f1d0b66775aa817c42dc482e6654d5a3d6860f Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Wed, 28 Sep 2016 18:39:36 +0300
Subject: MAINT-6123 Fix for LLTextureCache::writeToFastCache crash

---
 indra/newview/lltexturecache.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 37cc908e84..36c4f0d516 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1928,6 +1928,12 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
 		{
 			//make a duplicate to keep the original raw image untouched.
 			raw = raw->duplicate();
+			if (raw->isBufferInvalid())
+			{
+				LL_WARNS() << "Invalid image duplicate buffer" << LL_ENDL;
+				return false;
+			}
+
 			raw->scale(w, h) ;
 			
 			discardlevel += i ;
-- 
cgit v1.2.3


From a14b9cb604482b5fc1ff09167cab058e1f81244b Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Fri, 7 Oct 2016 03:52:04 +0300
Subject: MAINT-6635 Fix for LLImageGL::setSize crash

---
 indra/llrender/llimagegl.cpp | 19 +++++++++++++++----
 indra/llrender/llimagegl.h   |  2 +-
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index ebed454271..81a5537f78 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -487,14 +487,15 @@ bool LLImageGL::checkSize(S32 width, S32 height)
 	return check_power_of_two(width) && check_power_of_two(height);
 }
 
-void LLImageGL::setSize(S32 width, S32 height, S32 ncomponents, S32 discard_level)
+bool LLImageGL::setSize(S32 width, S32 height, S32 ncomponents, S32 discard_level)
 {
 	if (width != mWidth || height != mHeight || ncomponents != mComponents)
 	{
 		// Check if dimensions are a power of two!
 		if (!checkSize(width,height))
 		{
-			LL_ERRS() << llformat("Texture has non power of two dimension: %dx%d",width,height) << LL_ENDL;
+			LL_WARNS() << llformat("Texture has non power of two dimension: %dx%d",width,height) << LL_ENDL;
+			return false;
 		}
 		
 		if (mTexName)
@@ -529,6 +530,8 @@ void LLImageGL::setSize(S32 width, S32 height, S32 ncomponents, S32 discard_leve
 			mMaxDiscardLevel = MAX_DISCARD_LEVEL;
 		}
 	}
+
+	return true;
 }
 
 //----------------------------------------------------------------------------
@@ -909,7 +912,11 @@ BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
 	S32 h = raw_image->getHeight() << discard_level;
 
 	// setSize may call destroyGLTexture if the size does not match
-	setSize(w, h, raw_image->getComponents(), discard_level);
+	if (!setSize(w, h, raw_image->getComponents(), discard_level))
+	{
+		LL_WARNS() << "Trying to create a texture with incorrect dimensions!" << LL_ENDL;
+		return FALSE;
+	}
 
 	if( !mHasExplicitFormat )
 	{
@@ -1273,7 +1280,11 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
 	S32 h = raw_h << discard_level;
 
 	// setSize may call destroyGLTexture if the size does not match
-	setSize(w, h, imageraw->getComponents(), discard_level);
+	if (!setSize(w, h, imageraw->getComponents(), discard_level))
+	{
+		LL_WARNS() << "Trying to create a texture with incorrect dimensions!" << LL_ENDL;
+		return FALSE;
+	}
 
 	if( !mHasExplicitFormat )
 	{
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index 21982eab1d..ad2aea9067 100644
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -94,7 +94,7 @@ protected:
 public:
 	virtual void dump();	// debugging info to LL_INFOS()
 	
-	void setSize(S32 width, S32 height, S32 ncomponents, S32 discard_level = -1);
+	bool setSize(S32 width, S32 height, S32 ncomponents, S32 discard_level = -1);
 	void setComponents(S32 ncomponents) { mComponents = (S8)ncomponents ;}
 	void setAllowCompression(bool allow) { mAllowCompression = allow; }
 
-- 
cgit v1.2.3