From 484994b43b65f19d3d64c7ea3760313277e9e138 Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Wed, 11 Apr 2012 12:20:03 -0500
Subject: [PATCH] MAINT-870 Fix for crash from out of control lawns.

---
 indra/llrender/llvertexbuffer.cpp |  4 ++--
 indra/newview/llvopartgroup.cpp   | 21 ++++++++++++++-------
 indra/newview/llvovolume.cpp      |  8 ++++++--
 3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index b4899209c41..879888d1854 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -1207,10 +1207,10 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
 
 	llassert(nverts >= 0);
 
-	if (nverts >= 65535)
+	if (nverts > 65536)
 	{
 		llwarns << "Vertex buffer overflow!" << llendl;
-		nverts = 65535;
+		nverts = 65536;
 	}
 
 	U32 needed_size = calcOffsets(mTypeMask, mOffsets, nverts);
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 5c10a80b073..6ce93d641c9 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -447,14 +447,21 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
 				continue;
 			}
 			
-			count++;
-			facep->mDistance = (facep->mCenterLocal - camera->getOrigin()) * camera->getAtAxis();
-			obj->mDepth += facep->mDistance;
+			if ((facep->getGeomCount() + vertex_count) <= 65536)
+			{
+				count++;
+				facep->mDistance = (facep->mCenterLocal - camera->getOrigin()) * camera->getAtAxis();
+				obj->mDepth += facep->mDistance;
 			
-			mFaceList.push_back(facep);
-			vertex_count += facep->getGeomCount();
-			index_count += facep->getIndicesCount();
-			llassert(facep->getIndicesCount() < 65536);
+				mFaceList.push_back(facep);
+				vertex_count += facep->getGeomCount();
+				index_count += facep->getIndicesCount();
+				llassert(facep->getIndicesCount() < 65536);
+			}
+			else
+			{
+				facep->clearVertexBuffer();
+			}
 		}
 		
 		obj->mDepth /= count;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 080d1f774a0..16b61496a6f 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -5089,6 +5089,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
 	mFaceList.clear();
 
 	//for each drawable
+
 	for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
 	{
 		LLDrawable* drawablep = *drawable_iter;
@@ -5109,11 +5110,14 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
 			//sum up face verts and indices
 			drawablep->updateFaceSize(i);
 			LLFace* facep = drawablep->getFace(i);
-			if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
+
+			
+			if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA && 
+				facep->getGeomCount() + vertex_count <= 65536)
 			{
 				vertex_count += facep->getGeomCount();
 				index_count += facep->getIndicesCount();
-				llassert(facep->getIndicesCount() < 65536);
+				
 				//remember face (for sorting)
 				mFaceList.push_back(facep);
 			}
-- 
GitLab