From c0f2928e7dc1592b5b5d842869f660eede746dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 25 Nov 2002 18:42:40 +0000 Subject: [PATCH] Now uses Inode::GetName() where appropriate. Fixed a bigger race condition when matching against the name index. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2085 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/file_systems/bfs/Query.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/file_systems/bfs/Query.cpp b/src/add-ons/kernel/file_systems/bfs/Query.cpp index c9d6f121b8..ad31f3794d 100644 --- a/src/add-ons/kernel/file_systems/bfs/Query.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Query.cpp @@ -800,10 +800,16 @@ Equation::Match(Inode *inode, const char *attributeName, int32 type, const uint8 } buffer = const_cast(key); } else if (!strcmp(fAttribute, "name")) { + // we need to lock before accessing Inode::Name() + inode->SmallDataLock().Lock(); + locked = true; + // if not, check for "fake" attributes, "name", "size", "last_modified", buffer = (uint8 *)inode->Name(); - if (buffer == NULL) + if (buffer == NULL) { + inode->SmallDataLock().Unlock(); return B_ERROR; + } type = B_STRING_TYPE; size = strlen((const char *)buffer); @@ -1059,7 +1065,9 @@ Equation::GetNextMatching(Volume *volume, TreeIterator *iterator, dirent->d_ino = offset; dirent->d_pdev = volume->ID(); dirent->d_pino = volume->ToVnode(inode->Parent()); - strcpy(dirent->d_name,inode->Name()); + + if (inode->GetName(dirent->d_name) < B_OK) + FATAL(("inode %Ld in query has no name!\n", inode->BlockNumber())); #ifdef KEEP_WRONG_DIRENT_RECLEN // ToDo: The available file systems in BeOS apparently don't set the