From efeaba0acd9b40d50a32e4c728489231fbaac7e8 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 29 Jan 2010 15:48:50 +0200
Subject: [PATCH] Fixed normal bug EXT-4762 ( Crash on exit from viewer in
 LLPanelPeopleMenus::ContextMenu) - reason: attempt to delete instance of the
 LLContextMenu from the LLPanelPeopleMenus::ContextMenu after it was deleted
 by menu holder on viewer exit. - fix: check if menu is not dead via stored
 LLHandle of the menu before deleting.

--HG--
branch : product-engine
---
 indra/newview/llpanelpeoplemenus.cpp | 10 +++++++++-
 indra/newview/llpanelpeoplemenus.h   |  1 +
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 501dac5dff4..470cfca8fec 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -61,7 +61,14 @@ ContextMenu::~ContextMenu()
 	// It can have registered Enable callbacks which are called from the LLMenuHolderGL::draw()
 	// via selected item (menu_item_call) by calling LLMenuItemCallGL::buildDrawLabel.
 	// we can have a crash via using callbacks of deleted instance of ContextMenu. EXT-4725
-	if (mMenu) 	mMenu->die();
+
+	// menu holder deletes its menus on viewer exit, so we have no way to determine if instance 
+	// of mMenu has already been deleted except of using LLHandle. EXT-4762.
+	if (!mMenuHandle.isDead())
+	{
+		mMenu->die();
+		mMenu = NULL;
+	}
 }
 
 void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
@@ -86,6 +93,7 @@ void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids,
 	std::copy(uuids.begin(), uuids.end(), mUUIDs.begin());
 
 	mMenu = createMenu();
+	mMenuHandle = mMenu->getHandle();
 	mMenu->show(x, y);
 	LLMenuGL::showPopup(spawning_view, mMenu, x, y);
 }
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index 7251f6dbbdb..913638d8c86 100644
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -62,6 +62,7 @@ class ContextMenu : public LLAvatarListItem::ContextMenu
 
 	std::vector<LLUUID>	mUUIDs;
 	LLContextMenu*		mMenu;
+	LLHandle<LLView>	mMenuHandle;
 };
 
 /**
-- 
GitLab