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;