From 9335e141bac58250fcd93e621eff88206614c754 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Mon, 3 Sep 2012 16:24:28 -0400 Subject: [PATCH] Fix crash when dragging files onto nav menus. - BNavMenu now keeps its own copy of the cached types list that's passed to it. In some circumstances it could happen that the container window would delete the list and consequently the nav menu would wind up with a pointer to an invalid object. Probably a regression from the async mouse tracking rewrites. --- headers/private/tracker/NavMenu.h | 12 ++++++------ src/kits/tracker/NavMenu.cpp | 11 ++++++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/headers/private/tracker/NavMenu.h b/headers/private/tracker/NavMenu.h index 127d94f255..0726c36d94 100644 --- a/headers/private/tracker/NavMenu.h +++ b/headers/private/tracker/NavMenu.h @@ -80,12 +80,12 @@ class BNavMenu : public BSlowMenu { BWindow *parentWindow = NULL, const BObjectList *list = NULL); // parentWindow, if specified, will be closed if nav menu item invoked // with option held down - + virtual ~BNavMenu(); - + virtual void AttachedToWindow(); virtual void DetachedFromWindow(); - + void SetNavDir(const entry_ref *); void ForceRebuild(); bool NeedsToRebuild() const; @@ -96,7 +96,7 @@ class BNavMenu : public BSlowMenu { BMessenger Target(); void SetTypesList(const BObjectList *list); - const BObjectList *TypesList() const; + const BObjectList *TypesList() const; void AddNavDir(const Model *model, uint32 what, BHandler *target, bool populateSubmenu); @@ -121,7 +121,7 @@ class BNavMenu : public BSlowMenu { protected: virtual bool StartBuildingItemList(); virtual bool AddNextItem(); - virtual void DoneBuildingItemList(); + virtual void DoneBuildingItemList(); virtual void ClearMenuBuildingState(); void BuildVolumeMenu(); @@ -142,7 +142,7 @@ class BNavMenu : public BSlowMenu { EntryListBase *fContainer; bool fIteratingDesktop; - const BObjectList *fTypesList; + BObjectList *fTypesList; TrackingHookData fTrackingHook; }; diff --git a/src/kits/tracker/NavMenu.cpp b/src/kits/tracker/NavMenu.cpp index aa6526d383..4dc61778d3 100644 --- a/src/kits/tracker/NavMenu.cpp +++ b/src/kits/tracker/NavMenu.cpp @@ -263,8 +263,10 @@ BNavMenu::BNavMenu(const char* title, uint32 message, const BHandler* target, fFlags(0), fItemList(0), fContainer(0), - fTypesList(list) + fTypesList(new BObjectList(10, true)) { + if (list != NULL) + *fTypesList = *list; InitIconPreloader(); SetFont(be_plain_font); @@ -292,8 +294,10 @@ BNavMenu::BNavMenu(const char* title, uint32 message, fFlags(0), fItemList(0), fContainer(0), - fTypesList(list) + fTypesList(new BObjectList(10, true)) { + if (list != NULL) + *fTypesList = *list; InitIconPreloader(); SetFont(be_plain_font); @@ -313,6 +317,7 @@ BNavMenu::BNavMenu(const char* title, uint32 message, BNavMenu::~BNavMenu() { + delete fTypesList; } @@ -814,7 +819,7 @@ BNavMenu::SetShowParent(bool show) void BNavMenu::SetTypesList(const BObjectList* list) { - fTypesList = list; + *fTypesList = *list; }