From 8c121d2ca1bf7777b61b78a56cc9f053d01aa0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 14 Jul 2008 23:23:16 +0000 Subject: [PATCH] * Fixed the bug described by Salvatore: since we let BFS open directories with read/write access, we shouldn't let it truncate the directory B+tree... * Also fixed allowing truncation in read-only mode. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26416 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 c39999f859..e9681aa32d 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -1147,7 +1147,14 @@ bfs_open(fs_volume *_volume, fs_vnode *_node, int openMode, void **_cookie) cookie->last_notification = system_time(); // Should we truncate the file? - if (openMode & O_TRUNC) { + 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()); WriteLocker locker(inode->Lock());