From 6a68f16f2e908838b89216543b36f07e2a71c360 Mon Sep 17 00:00:00 2001
From: Merov Linden <merov@lindenlab.com>
Date: Mon, 4 Feb 2013 19:29:05 -0800
Subject: [PATCH] CHUI-732 : Fixed! Do not iterate through selection while
 modufying it at the same time, use a temp set.

---
 indra/llui/llfolderview.cpp | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index 7c1ca017d7e..c756ff84e10 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -924,23 +924,27 @@ void LLFolderView::cut()
 {
 	// clear the inventory clipboard
 	LLClipboard::instance().reset();
-	S32 count = mSelectedItems.size();
-	if(getVisible() && getEnabled() && (count > 0))
+	if(getVisible() && getEnabled() && (mSelectedItems.size() > 0))
 	{
+		// Find out which item will be selected once the selection will be cut
 		LLFolderViewItem* item_to_select = getNextUnselectedItem();
+		
+		// Get the selection: removeItem() modified mSelectedItems and makes iterating on it unwise
+		std::set<LLFolderViewItem*> inventory_selected = getSelectionList();
 
-		selected_items_t::iterator item_it;
-		for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
+		// Move each item to the clipboard and out of their folder
+		for (std::set<LLFolderViewItem*>::iterator item_it = inventory_selected.begin(); item_it != inventory_selected.end(); ++item_it)
 		{
 			LLFolderViewItem* item_to_cut = *item_it;
 			LLFolderViewModelItem* listener = item_to_cut->getViewModelItem();
-			if(listener)
+			if (listener)
 			{
 				listener->cutToClipboard();
 				listener->removeItem();
 			}
 		}
-
+		
+		// Update the selection
 		setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, mParentPanel->hasFocus());
 	}
 	mSearchString.clear();
-- 
GitLab