From 0fc30d893468d504ba14cb3685ae45c1309290e3 Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Thu, 9 Apr 2015 16:22:37 +0200 Subject: [PATCH] Deskbar: Sanitize the usage of BMessage ... especially for SendMessage and SendReply. * Delete the item's message if AddItem does not return successfully. * Fixes #11934. Signed-off-by: Adrien Destugues --- src/apps/deskbar/BarView.cpp | 3 ++- src/apps/deskbar/BarWindow.cpp | 16 ++++++++++------ src/apps/deskbar/StatusView.cpp | 23 ++++++++++++----------- src/apps/deskbar/TimeView.cpp | 4 ++-- src/kits/interface/Shelf.cpp | 17 ++++++++++++----- 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/apps/deskbar/BarView.cpp b/src/apps/deskbar/BarView.cpp index 3f8fc8db15..8634207243 100644 --- a/src/apps/deskbar/BarView.cpp +++ b/src/apps/deskbar/BarView.cpp @@ -263,7 +263,8 @@ TBarView::MessageReceived(BMessage* message) // so that I can follow the common pathway // for adding icons to the tray int32 id; - AddItem(new BMessage(*message), B_DESKBAR_TRAY, &id); + if (AddItem(message, B_DESKBAR_TRAY, &id) == B_OK) + Looper()->DetachCurrentMessage(); break; } diff --git a/src/apps/deskbar/BarWindow.cpp b/src/apps/deskbar/BarWindow.cpp index 0fd262eff0..2ca730154e 100644 --- a/src/apps/deskbar/BarWindow.cpp +++ b/src/apps/deskbar/BarWindow.cpp @@ -39,6 +39,7 @@ All rights reserved. #include #include +#include #include #include #include @@ -516,15 +517,18 @@ TBarWindow::AddItem(BMessage* message) BMessage reply; status_t err = B_ERROR; - BMessage archivedView; - if (message->FindMessage("view", &archivedView) == B_OK) { + BMessage* archivedView = new BMessage(); + ObjectDeleter deleter(archivedView); + if (message->FindMessage("view", archivedView) == B_OK) { #if SHELF_AWARE message->FindInt32("shelf", &shelf); #endif - BMessage* archive = new BMessage(archivedView); - err = fBarView->AddItem(archive, shelf, &id); - if (err < B_OK) - delete archive; + err = fBarView->AddItem(archivedView, shelf, &id); + if (err == B_OK) { + // Detach the deleter since AddReplicant is taking ownership + // on success. This should be changed on server side. + deleter.Detach(); + } } else if (message->FindRef("addon", &ref) == B_OK) { BEntry entry(&ref); err = entry.InitCheck(); diff --git a/src/apps/deskbar/StatusView.cpp b/src/apps/deskbar/StatusView.cpp index a0139cf816..dde88ed968 100644 --- a/src/apps/deskbar/StatusView.cpp +++ b/src/apps/deskbar/StatusView.cpp @@ -337,12 +337,12 @@ TReplicantTray::MessageReceived(BMessage* message) bool showDayOfWeek = fTime->ShowDayOfWeek(); bool showTimeZone = fTime->ShowTimeZone(); - BMessage* reply = new BMessage(kGetClockSettings); - reply->AddBool("showClock", showClock); - reply->AddBool("showSeconds", showSeconds); - reply->AddBool("showDayOfWeek", showDayOfWeek); - reply->AddBool("showTimeZone", showTimeZone); - message->SendReply(reply); + BMessage reply(kGetClockSettings); + reply.AddBool("showClock", showClock); + reply.AddBool("showSeconds", showSeconds); + reply.AddBool("showDayOfWeek", showDayOfWeek); + reply.AddBool("showTimeZone", showTimeZone); + message->SendReply(&reply); break; } @@ -451,9 +451,9 @@ TReplicantTray::ShowHideTime() // Send a message to Time preferences telling it to update BMessenger messenger("application/x-vnd.Haiku-Time"); - BMessage* message = new BMessage(kShowHideTime); - message->AddBool("showClock", showClock); - messenger.SendMessage(message); + BMessage message(kShowHideTime); + message.AddBool("showClock", showClock); + messenger.SendMessage(&message); } @@ -673,8 +673,9 @@ TReplicantTray::LoadAddOn(BEntry* entry, int32* id, bool addToSettings) view->Archive(data); delete view; - AddIcon(data, id, &ref); - // add the rep; adds info to list + // add the rep; adds info to list + if (AddIcon(data, id, &ref) != B_OK) + delete data; if (addToSettings) { fAddOnSettings.AddString(kReplicantPathField, path.Path()); diff --git a/src/apps/deskbar/TimeView.cpp b/src/apps/deskbar/TimeView.cpp index 742b391330..5a96ed8d64 100644 --- a/src/apps/deskbar/TimeView.cpp +++ b/src/apps/deskbar/TimeView.cpp @@ -195,8 +195,8 @@ TTimeView::MessageReceived(BMessage* message) be_roster->Launch("application/x-vnd.Haiku-Time"); // tell Time preflet to switch to the clock tab BMessenger messenger("application/x-vnd.Haiku-Time"); - BMessage* switchToClock = new BMessage('SlCk'); - messenger.SendMessage(switchToClock); + BMessage switchToClock('SlCk'); + messenger.SendMessage(&switchToClock); break; } diff --git a/src/kits/interface/Shelf.cpp b/src/kits/interface/Shelf.cpp index 99cd7070fa..7d215dd5e4 100644 --- a/src/kits/interface/Shelf.cpp +++ b/src/kits/interface/Shelf.cpp @@ -16,6 +16,7 @@ #include +#include #include #include #include @@ -1178,13 +1179,19 @@ BShelf::_InitData(BEntry *entry, BDataIO *stream, BView *view, genCount = 1; BMessage replicant; - BMessage *replmsg = NULL; - for (int32 i = 0; archive.FindMessage("replicant", i, &replicant) == B_OK; i++) { + for (int32 i = 0; archive.FindMessage("replicant", i, &replicant) + == B_OK; i++) { BPoint point; - replmsg = new BMessage(); + BMessage *replMsg = new BMessage(); + ObjectDeleter deleter(replMsg); replicant.FindPoint("position", &point); - replicant.FindMessage("message", replmsg); - AddReplicant(replmsg, point); + if (replicant.FindMessage("message", replMsg) == B_OK) + if (AddReplicant(replMsg, point) == B_OK) { + // Detach the deleter since AddReplicant is taking + // ownership on success. In R2 API this should be + // changed to take always ownership on the message. + deleter.Detach(); + } } } }