From a9831b73eda88c26148c625a1762a5c5ea326d3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 25 Oct 2006 13:16:43 +0000 Subject: [PATCH] CheckInode() could find an invalid data stream for symlinks without a data stream; the data stream area is reused as link data in this case. Reported by Robert Szeleney. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19120 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp | 8 ++++++++ .../add-ons/kernel/file_systems/bfs/r5/BlockAllocator.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp index 2c3b312e3b..34f9e15997 100644 --- a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp +++ b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp @@ -1202,6 +1202,14 @@ BlockAllocator::CheckInode(Inode *inode, check_control *control) if (status < B_OK) return status; + if (inode->IsSymLink() && (inode->Flags() & INODE_LONG_SYMLINK) == 0) { + // symlinks may not have a valid data stream + if (strlen(inode->Node().short_symlink) >= SHORT_SYMLINK_NAME_LENGTH) + return B_BAD_DATA; + + return B_OK; + } + data_stream *data = &inode->Node().data; // check the direct range diff --git a/src/tests/add-ons/kernel/file_systems/bfs/r5/BlockAllocator.cpp b/src/tests/add-ons/kernel/file_systems/bfs/r5/BlockAllocator.cpp index 6af62c984d..bd55c4c984 100644 --- a/src/tests/add-ons/kernel/file_systems/bfs/r5/BlockAllocator.cpp +++ b/src/tests/add-ons/kernel/file_systems/bfs/r5/BlockAllocator.cpp @@ -1140,6 +1140,14 @@ BlockAllocator::CheckInode(Inode *inode, check_control *control) if (status < B_OK) return status; + if (inode->IsSymLink() && (inode->Flags() & INODE_LONG_SYMLINK) == 0) { + // symlinks may not have a valid data stream + if (strlen(inode->Node()->short_symlink) >= SHORT_SYMLINK_NAME_LENGTH) + return B_BAD_DATA; + + return B_OK; + } + data_stream *data = &inode->Node()->data; // check the direct range