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: [PATCH] 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 ebed4542712..81a5537f78d 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 21982eab1dd..ad2aea90675 100644
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -94,7 +94,7 @@ class LLImageGL : public LLRefCount, public LLTrace::MemTrackable<LLImageGL>
 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; }
 
-- 
GitLab