From a6cf8e1c4ec4a567f828911a80a209d1e2198ff3 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 24 Oct 2013 20:24:51 +0200 Subject: [PATCH] package daemon: Fix error handling of manually added packages Since we don't move those packages out of the "packages" directory, we don't want to remove their respective object from the hash tables either. Fixes #10102. --- src/servers/package/Volume.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/servers/package/Volume.cpp b/src/servers/package/Volume.cpp index 0b1cd3ae77..2f2a70d287 100644 --- a/src/servers/package/Volume.cpp +++ b/src/servers/package/Volume.cpp @@ -114,7 +114,7 @@ struct Volume::CommitTransactionHandler { const PackageSet& packagesAlreadyRemoved) : fVolume(volume), - fPackagesToActivate(20, true), + fPackagesToActivate(), fPackagesToDeactivate(), fAddedPackages(), fRemovedPackages(), @@ -126,6 +126,20 @@ struct Volume::CommitTransactionHandler { { } + ~CommitTransactionHandler() + { + // Delete Package objects we created in case of error (on success + // fPackagesToActivate will be empty). + int32 count = fPackagesToActivate.CountItems(); + for (int32 i = 0; i < count; i++) { + Package* package = fPackagesToActivate.ItemAt(i); + if (fPackagesAlreadyAdded.find(package) + == fPackagesAlreadyAdded.end()) { + delete package; + } + } + } + void HandleRequest(BMessage* request, BMessage* reply) { status_t error; @@ -959,13 +973,14 @@ private: it != fAddedPackages.end(); ++it) { // remove package from the volume Package* package = *it; - fVolume->_RemovePackage(package); if (fPackagesAlreadyAdded.find(package) != fPackagesAlreadyAdded.end()) { continue; } + fVolume->_RemovePackage(package); + if (transactionDirectory.InitCheck() != B_OK) continue;