From a786c139ef3ebe2ac00e4de9231b1e666260a2b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 8 May 2009 14:48:51 +0000 Subject: [PATCH] * Removed the work-around that allowed to open directories read/write. See ticket #3875. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30675 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/file_systems/bfs/kernel_interface.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp index c96fca3fb7..7c185b6a69 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -1168,18 +1168,14 @@ bfs_open(fs_volume* _volume, fs_vnode* _node, int openMode, void** _cookie) Volume* volume = (Volume*)_volume->private_volume; Inode* inode = (Inode*)_node->private_node; - // opening a directory read-only is allowed, although you can't read + // Opening a directory read-only is allowed, although you can't read // any data from it. - if (inode->IsDirectory() && (openMode & O_RWMASK) != 0) { - openMode = openMode & ~O_RWMASK; - // TODO: for compatibility reasons, we don't return an error here... - // e.g. "copyattr" tries to do that - //return B_IS_A_DIRECTORY; - } + if (inode->IsDirectory() && (openMode & O_RWMASK) != O_RDONLY) + return B_IS_A_DIRECTORY; status_t status = inode->CheckPermissions(open_mode_to_access(openMode) | (openMode & O_TRUNC ? W_OK : 0)); - if (status < B_OK) + if (status != B_OK) RETURN_ERROR(status); file_cookie* cookie = new(std::nothrow) file_cookie; @@ -1205,10 +1201,6 @@ bfs_open(fs_volume* _volume, fs_vnode* _node, int openMode, void** _cookie) if ((openMode & O_TRUNC) != 0) { if ((openMode & O_RWMASK) == O_RDONLY) return B_NOT_ALLOWED; - // TODO: this check is only necessary as long as we allow directories - // to be opened r/w, see above. - if (inode->IsDirectory()) - return B_IS_A_DIRECTORY; Transaction transaction(volume, inode->BlockNumber()); inode->WriteLockInTransaction(transaction);