diff options
| author | andreykproductengine <andreykproductengine@lindenlab.com> | 2017-11-28 16:05:29 +0200 | 
|---|---|---|
| committer | andreykproductengine <andreykproductengine@lindenlab.com> | 2017-11-28 16:05:29 +0200 | 
| commit | 1c711ca0272a23895c7004f14caf035f16ecefdf (patch) | |
| tree | f80cca9d9cd5441514c8937dcaae70cc18b421f8 | |
| parent | dcfccc6f435610077592bbddcef2468c64f27f2f (diff) | |
MAINT-8029 Crash in onCompleted()
| -rw-r--r-- | indra/newview/llmeshrepository.cpp | 29 | 
1 files changed, 21 insertions, 8 deletions
| diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index df708013fc..850a25107f 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -2918,9 +2918,12 @@ void LLMeshHandlerBase::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRespo  			// handler, optional first that takes a body, fallback second  			// that requires a temporary allocation and data copy.  			body_offset = mOffset - offset; -			data = new U8[data_size - body_offset]; -			body->read(body_offset, (char *) data, data_size - body_offset); -			LLMeshRepository::sBytesReceived += data_size; +			data = new(std::nothrow) U8[data_size - body_offset]; +			if (data) +			{ +				body->read(body_offset, (char *) data, data_size - body_offset); +				LLMeshRepository::sBytesReceived += data_size; +			}  		}  		processData(body, body_offset, data, data_size - body_offset); @@ -2969,7 +2972,9 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b  									  U8 * data, S32 data_size)  {  	LLUUID mesh_id = mMeshParams.getSculptID(); -	bool success = (! MESH_HEADER_PROCESS_FAILED) && gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size); +	bool success = (! MESH_HEADER_PROCESS_FAILED) +		&& ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong +		&& gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size);  	llassert(success);  	if (! success)  	{ @@ -3093,7 +3098,9 @@ void LLMeshLODHandler::processFailure(LLCore::HttpStatus status)  void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body_offset */,  								   U8 * data, S32 data_size)  { -	if ((! MESH_LOD_PROCESS_FAILED) && gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size)) +	if ((!MESH_LOD_PROCESS_FAILED) +		&& ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong +		&& gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size))  	{  		// good fetch from sim, write to VFS for caching  		LLVFile file(gVFS, mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLVFile::WRITE); @@ -3141,7 +3148,9 @@ void LLMeshSkinInfoHandler::processFailure(LLCore::HttpStatus status)  void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /* body_offset */,  										U8 * data, S32 data_size)  { -	if ((! MESH_SKIN_INFO_PROCESS_FAILED) && gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size)) +	if ((!MESH_SKIN_INFO_PROCESS_FAILED) +		&& ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong +		&& gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))  	{  		// good fetch from sim, write to VFS for caching  		LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE); @@ -3187,7 +3196,9 @@ void LLMeshDecompositionHandler::processFailure(LLCore::HttpStatus status)  void LLMeshDecompositionHandler::processData(LLCore::BufferArray * /* body */, S32 /* body_offset */,  											 U8 * data, S32 data_size)  { -	if ((! MESH_DECOMP_PROCESS_FAILED) && gMeshRepo.mThread->decompositionReceived(mMeshID, data, data_size)) +	if ((!MESH_DECOMP_PROCESS_FAILED) +		&& ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong +		&& gMeshRepo.mThread->decompositionReceived(mMeshID, data, data_size))  	{  		// good fetch from sim, write to VFS for caching  		LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE); @@ -3232,7 +3243,9 @@ void LLMeshPhysicsShapeHandler::processFailure(LLCore::HttpStatus status)  void LLMeshPhysicsShapeHandler::processData(LLCore::BufferArray * /* body */, S32 /* body_offset */,  											U8 * data, S32 data_size)  { -	if ((! MESH_PHYS_SHAPE_PROCESS_FAILED) && gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size)) +	if ((!MESH_PHYS_SHAPE_PROCESS_FAILED) +		&& ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong +		&& gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size))  	{  		// good fetch from sim, write to VFS for caching  		LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE); | 
