]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
client: check if inode ref is dir before proceeding with lookup
authorDhairya Parmar <dparmar@redhat.com>
Tue, 8 Apr 2025 13:53:48 +0000 (19:23 +0530)
committerDhairya Parmar <dparmar@redhat.com>
Tue, 23 Sep 2025 18:57:58 +0000 (00:27 +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>
(cherry picked from commit aa6ffa5159f6c9e14000a7501a394b1185b63078)

src/client/Client.cc

index 74933349247061c180725e36415a053a497c4977..e4a1a3be90f1ca1757e237f18d48a5c7af7ddedc 100644 (file)
@@ -7503,6 +7503,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);
@@ -7529,11 +7534,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;