From 0494f8a6f052acd8ff9d830cb7ccb0a73793cfe6 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 26 Nov 2013 01:52:43 +0100 Subject: [PATCH] bindfs: Volume: Don't leak source directory vnode reference --- src/add-ons/kernel/file_systems/bindfs/Volume.cpp | 10 ++++++---- src/add-ons/kernel/file_systems/bindfs/Volume.h | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/file_systems/bindfs/Volume.cpp b/src/add-ons/kernel/file_systems/bindfs/Volume.cpp index 2c5013e92c..24453909cf 100644 --- a/src/add-ons/kernel/file_systems/bindfs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/bindfs/Volume.cpp @@ -33,6 +33,7 @@ Volume::Volume(fs_volume* fsVolume) : fFSVolume(fsVolume), fSourceFSVolume(NULL), + fSourceVnode(NULL), fRootNode(NULL) { } @@ -40,6 +41,8 @@ Volume::Volume(fs_volume* fsVolume) Volume::~Volume() { + if (fSourceVnode != NULL) + vfs_put_vnode(fSourceVnode); } @@ -57,13 +60,12 @@ Volume::Mount(const char* parameterString) RETURN_ERROR(B_BAD_VALUE); } - struct vnode* sourceVnode; - status_t error = vfs_get_vnode_from_path(source, true, &sourceVnode); + status_t error = vfs_get_vnode_from_path(source, true, &fSourceVnode); if (error != B_OK) RETURN_ERROR(error); - if (sourceVnode == NULL) + if (fSourceVnode == NULL) RETURN_ERROR(B_ENTRY_NOT_FOUND); - fs_vnode* sourceFSNode = vfs_fsnode_for_vnode(sourceVnode); + fs_vnode* sourceFSNode = vfs_fsnode_for_vnode(fSourceVnode); fSourceFSVolume = volume_for_vnode(sourceFSNode); struct stat st; diff --git a/src/add-ons/kernel/file_systems/bindfs/Volume.h b/src/add-ons/kernel/file_systems/bindfs/Volume.h index bacaba3036..6d06e24baa 100644 --- a/src/add-ons/kernel/file_systems/bindfs/Volume.h +++ b/src/add-ons/kernel/file_systems/bindfs/Volume.h @@ -10,6 +10,7 @@ class Node; +struct vnode; class Volume { @@ -41,6 +42,7 @@ private: private: fs_volume* fFSVolume; fs_volume* fSourceFSVolume; + vnode* fSourceVnode; Node* fRootNode; fs_vnode_ops fVnodeOps;