From 75a66a146b8f4b3127eb86fec10c24cc45d3f6d7 Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Thu, 26 Aug 2010 18:59:08 +0300
Subject: [PATCH] EXT-8727 FIXED Potential fix for a crash in
 LLAppearanceMgr::updateClothingOrderingInfo.

I couldn't reproduce the problem (it has happened for only two users, both running MacOSX),
but from what I see in the logs, it might have been caused by (or related to) NULL COF items.
I haven't found out how they appear nor what exactly causes the crash, but just for any
case I added a check to make sure we don't try to update wearables ordering info for such items.

Reviewed by Sergey Litovchuk at https://codereview.productengine.com/secondlife/r/876/

--HG--
branch : product-engine
---
 indra/newview/llagentwearablesfetch.cpp | 1 +
 indra/newview/llappearancemgr.cpp       | 8 +++++++-
 indra/newview/llappearancemgr.h         | 2 ++
 indra/newview/llinventorymodel.cpp      | 2 +-
 4 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index f7ae320a6f..1edc96e165 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -115,6 +115,7 @@ void LLInitialWearablesFetch::processContents()
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t wearable_array;
 	LLFindWearables is_wearable;
+	llassert_always(mComplete.size() != 0);
 	gInventory.collectDescendentsIf(mComplete.front(), cat_array, wearable_array, 
 									LLInventoryModel::EXCLUDE_TRASH, is_wearable);
 
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 94286fd799..7159d89d21 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -2307,12 +2307,17 @@ bool LLAppearanceMgr::updateBaseOutfit()
 
 void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type)
 {
-	items_by_type.reserve(LLWearableType::WT_COUNT);
+	items_by_type.resize(LLWearableType::WT_COUNT);
 	if (items.empty()) return;
 
 	for (S32 i=0; i<items.count(); i++)
 	{
 		LLViewerInventoryItem *item = items.get(i);
+		if (!item)
+		{
+			LL_WARNS("Appearance") << "NULL item found" << llendl;
+			continue;
+		}
 		// Ignore non-wearables.
 		if (!item->isWearableType())
 			continue;
@@ -2335,6 +2340,7 @@ std::string build_order_string(LLWearableType::EType type, U32 i)
 
 struct WearablesOrderComparator
 {
+	LOG_CLASS(WearablesOrderComparator);
 	WearablesOrderComparator(const LLWearableType::EType type)
 	{
 		mControlSize = build_order_string(type, 0).size();
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 78c2142ea5..c65d9dc9ee 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -42,6 +42,8 @@ class LLOutfitUnLockTimer;
 
 class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
 {
+	LOG_CLASS(LLAppearanceMgr);
+
 	friend class LLSingleton<LLAppearanceMgr>;
 	friend class LLOutfitUnLockTimer;
 	
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 08229d3a50..53835f0166 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -501,7 +501,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
 		for(S32 i = 0; i < count; ++i)
 		{
 			item = item_array->get(i);
-			if (item->getActualType() == LLAssetType::AT_LINK_FOLDER)
+			if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER)
 			{
 				LLViewerInventoryCategory *linked_cat = item->getLinkedCategory();
 				if (linked_cat && linked_cat->getPreferredType() != LLFolderType::FT_OUTFIT)
-- 
GitLab