From 2574d1c1fee9b6deffd8d9224d62e91848c1d0e3 Mon Sep 17 00:00:00 2001
From: andreykproductengine <akleshchev@productengine.com>
Date: Wed, 1 Jul 2015 20:07:56 +0300
Subject: [PATCH] MAINT-2864 FIXED Viewer crashes when clicking "Ok" on "Delete
 Selected Item" modal from a non existant object.

---
 indra/newview/llinventoryfunctions.cpp | 27 +++++++++++++-------------
 indra/newview/llinventoryfunctions.h   |  2 --
 2 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 6f6861dc7b..ae799e8b18 100755
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -674,6 +674,19 @@ void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_fold
 	open_outbox();
 }
 
+static void items_removal_confirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (option == 0 && !root.isDead() && !root.get()->isDead())
+	{
+		LLFolderView* folder_root = root.get();
+		//Need to remove item from DND before item is removed from root folder view
+		//because once removed from root folder view the item is no longer a selected item
+		LLInventoryAction::removeItemFromDND(folder_root);
+		folder_root->removeSelectedItems();
+	}
+}
+
 ///----------------------------------------------------------------------------
 /// LLInventoryCollectFunctor implementations
 ///----------------------------------------------------------------------------
@@ -1100,7 +1113,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
 	{
 		LLSD args;
 		args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" :  "DeleteItem");
-		LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root));
+		LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&items_removal_confirmation, _1, _2, root->getHandle()));
 		return;
 	}
 	if (("copy" == action) || ("cut" == action))
@@ -1205,15 +1218,3 @@ void LLInventoryAction::removeItemFromDND(LLFolderView* root)
         }
     }
 }
-
-void LLInventoryAction::onItemsRemovalConfirmation( const LLSD& notification, const LLSD& response, LLFolderView* root )
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	if (option == 0)
-	{
-        //Need to remove item from DND before item is removed from root folder view
-        //because once removed from root folder view the item is no longer a selected item
-        removeItemFromDND(root);
-		root->removeSelectedItems();
-	}
-}
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 6b3861aa79..92780eb10f 100755
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -438,8 +438,6 @@ public:
 struct LLInventoryAction
 {
 	static void doToSelected(class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
-
-	static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLFolderView* root);
     static void removeItemFromDND(LLFolderView* root);
 };
 
-- 
GitLab