From aeee1f7ec7eaad6c0eba6d7892c11b8e2197fe4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 14 Oct 2013 23:21:47 +0200 Subject: [PATCH] bfs: Fixed removing a listener that was never added. * When the tree constructor failed, the InodeAllocator would try to remove the tree from the transaction. However, in that case, it was never added to it. * Inode::fTree is no longer set if the tree constructor failed. * This fixes bug #10089. --- src/add-ons/kernel/file_systems/bfs/Inode.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/add-ons/kernel/file_systems/bfs/Inode.cpp b/src/add-ons/kernel/file_systems/bfs/Inode.cpp index d33970a614..a30e0d7902 100644 --- a/src/add-ons/kernel/file_systems/bfs/Inode.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Inode.cpp @@ -236,11 +236,18 @@ InodeAllocator::CreateTree() if ((fInode->Mode() & S_INDEX_TYPES) == 0) fInode->Node().mode |= HOST_ENDIAN_TO_BFS_INT32(S_STR_INDEX); - BPlusTree* tree = fInode->fTree - = new(std::nothrow) BPlusTree(*fTransaction, fInode); - if (tree == NULL || tree->InitCheck() < B_OK) + BPlusTree* tree = new(std::nothrow) BPlusTree(*fTransaction, fInode); + if (tree == NULL) return B_ERROR; + status_t status = tree->InitCheck(); + if (status != B_OK) { + delete tree; + return status; + } + + fInode->fTree = tree; + if (fInode->IsRegularNode()) { if (tree->Insert(*fTransaction, ".", fInode->ID()) < B_OK || tree->Insert(*fTransaction, "..",