]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: check if inode ref is dir before proceeding with lookup 62488/head
authorDhairya Parmar <dparmar@redhat.com>
Tue, 8 Apr 2025 13:53:48 +0000 (19:23 +0530)
committerDhairya Parmar <dparmar@redhat.com>
Fri, 20 Jun 2025 09:48:43 +0000 (15:18 +0530)
Lookup on non-dir inode is incorrect. Client::_lookup did check for it
but the order needed to be correct i.e. check for non-dir inode before
anything.

Fixes: https://tracker.ceph.com/issues/70553
Signed-off-by: Dhairya Parmar <dparmar@redhat.com>
src/client/Client.cc

index 6df734b9201fef384f06ee8a980144c62c95f2a7..66f02136cc46136a3cd293f36c59b7a4b356a666 100644 (file)
@@ -7517,6 +7517,11 @@ int Client::_lookup(const InodeRef& dir, const std::string& name, std::string& a
   mask &= CEPH_CAP_ANY_SHARED | CEPH_STAT_RSTAT;
   std::string dname = name;
 
+  if (!dir->is_dir()) {
+    r = -ENOTDIR;
+    goto done;
+  }
+
   if (dname == ".."sv) {
     if (dir->dentries.empty()) {
       MetaRequest *req = new MetaRequest(CEPH_MDS_OP_LOOKUPPARENT);
@@ -7543,11 +7548,6 @@ int Client::_lookup(const InodeRef& dir, const std::string& name, std::string& a
     goto done;
   }
 
-  if (!dir->is_dir()) {
-    r = -ENOTDIR;
-    goto done;
-  }
-
   if (dname.size() > NAME_MAX) {
     r = -ENAMETOOLONG;
     goto done;