From ce1d0481833eaa6aa22e1006e92602db3ed33f97 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 4 Apr 2013 22:25:23 +0200 Subject: [PATCH] packagefs: Fix adding package links twice to volume PackageLinkDirectory::NotifyDirectoryAdded() first notified the listener (Volume) about the directory itself, then about the links it contained. Since Volume adds the nodes recursively, the latter were added twice, resulting in a corrupted ID hash table. --- .../packagefs/PackageLinkDirectory.cpp | 20 ------------------- .../packagefs/PackageLinkDirectory.h | 3 --- .../packagefs/PackageLinksDirectory.cpp | 6 ++++-- 3 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp index ce14ceb957..48a11f54ac 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp @@ -149,26 +149,6 @@ PackageLinkDirectory::UpdatePackageDependencies(Package* package, } -void -PackageLinkDirectory::NotifyDirectoryAdded(PackageLinksListener* listener) -{ - NodeWriteLocker writeLocker(this); - - listener->PackageLinkNodeAdded(this); - - if (fSelfLink != NULL) { - NodeWriteLocker selfLinkLocker(fSelfLink); - listener->PackageLinkNodeAdded(fSelfLink); - } - - for (FamilyDependencyList::Iterator it = fDependencyLinks.GetIterator(); - DependencyLink* link = it.Next();) { - NodeWriteLocker linkLocker(link); - listener->PackageLinkNodeAdded(link); - } -} - - status_t PackageLinkDirectory::_Update(PackageLinksListener* listener) { diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h index c5adc7ff3d..798592c243 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h @@ -32,9 +32,6 @@ public: void UpdatePackageDependencies(Package* package, PackageLinksListener* listener); - void NotifyDirectoryAdded( - PackageLinksListener* listener); - bool IsEmpty() const { return fPackages.IsEmpty(); } diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp index bbe09e9610..b283dc6af8 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp @@ -70,8 +70,10 @@ PackageLinksDirectory::AddPackage(Package* package) // No entry is in the way, so just add the link directory. AddChild(linkDirectory); - if (fListener != NULL) - linkDirectory->NotifyDirectoryAdded(fListener); + if (fListener != NULL) { + NodeWriteLocker writeLocker(linkDirectory); + fListener->PackageLinkNodeAdded(linkDirectory); + } } return B_OK;