diff options
| author | Alexander Gavriliuk <alexandrgproductengine@lindenlab.com> | 2023-12-14 23:25:11 +0100 | 
|---|---|---|
| committer | Guru <alexandrgproductengine@lindenlab.com> | 2023-12-15 07:45:05 +0100 | 
| commit | 7f9438ed2b1e91aff615673ca2d97a3f300910f6 (patch) | |
| tree | 9581e7645e3af871625d8f84723b8aeaae84f586 | |
| parent | 70b6eaa6e3f462fa3086f57a15ca29a303191693 (diff) | |
SL-3508 Crash in LLKDUDecodeState::processTileDecode
| -rw-r--r-- | indra/llimage/llimage.cpp | 4 | ||||
| -rw-r--r-- | indra/llimage/llimagej2c.cpp | 14 | ||||
| -rw-r--r-- | indra/llkdu/llimagej2ckdu.cpp | 9 | 
3 files changed, 21 insertions, 6 deletions
| diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 031471d1fe..7ac80825b5 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -2130,6 +2130,10 @@ U8* LLImageFormatted::reallocateData(S32 size)  // virtual  void LLImageFormatted::deleteData()  { +    if (mDecoding) +    { +        LL_ERRS() << "LLImageFormatted::deleteData() is called during decoding" << LL_ENDL; +    }  	sGlobalFormattedMemory -= getDataSize();  	LLImageBase::deleteData();  } diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 8dba1641a6..a4957466d4 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -157,10 +157,10 @@ bool LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir      LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;  	LLTimer elapsed; -	bool res = true; -	  	resetLastError(); +	mDecoding = true; +	bool res;  	// Check to make sure that this instance has been initialized with data  	if (!getData() || (getDataSize() < 16))  	{ @@ -171,7 +171,6 @@ bool LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir  	{  		// Update the raw discard level  		updateRawDiscardLevel(); -		mDecoding = true;  		res = mImpl->decodeImpl(*this, *raw_imagep, decode_time, first_channel, max_channel_count);  	} @@ -181,12 +180,21 @@ bool LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir  		{  			// Failed  			raw_imagep->deleteData(); +			res = false;  		}  		else  		{  			mDecoding = false;  		}  	} +	else +	{ +		if (mDecoding) +		{ +			LL_WARNS() << "decodeImpl failed but mDecoding is TRUE" << LL_ENDL; +			mDecoding = false; +		} +	}  	if (!mLastError.empty())  	{ diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 2ad42d6b87..eeda08f21e 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -514,6 +514,7 @@ bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco      LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;  	ECodeStreamMode mode = MODE_FAST; +	bool limit_time = decode_time > 0.0f;  	LLTimer decode_timer;  	if (!mCodeStreamp->exists()) @@ -578,16 +579,18 @@ bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco  															mCodeStreamp.get()));  				}  				// Do the actual processing -				F32 remaining_time = decode_time - decode_timer.getElapsedTimeF32(); +				F32 remaining_time = limit_time ? decode_time - decode_timer.getElapsedTimeF32() : 0.0f;  				// This is where we do the actual decode.  If we run out of time, return false. -				if (mDecodeState->processTileDecode(remaining_time, (decode_time > 0.0f))) +				if (mDecodeState->processTileDecode(remaining_time, limit_time))  				{  					mDecodeState.reset();  				}  				else  				{  					// Not finished decoding yet. -					//					setLastError("Ran out of time while decoding"); +					base.setLastError("Ran out of time while decoding"); +					base.decodeFailed(); +					cleanupCodeStream();  					return false;  				}  			} | 
