]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: reject lookup ino requests for mds dirs
authorPatrick Donnelly <pdonnell@redhat.com>
Wed, 24 Mar 2021 20:54:17 +0000 (13:54 -0700)
committerPatrick Donnelly <pdonnell@redhat.com>
Mon, 28 Jun 2021 19:08:19 +0000 (12:08 -0700)
Fixes: https://tracker.ceph.com/issues/49922
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit 682a55e8a22a137f80855f2cdd98f6f230d67fce)

src/mds/Server.cc

index 22750c2fb75238e2632afd6bea849614e5383055..30425d47cf879c3e897c87267e95ae73cb700ede 100644 (file)
@@ -3908,6 +3908,19 @@ void Server::handle_client_lookup_ino(MDRequestRef& mdr,
     return _lookup_snap_ino(mdr);
 
   inodeno_t ino = req->get_filepath().get_ino();
+  auto _ino = ino.val;
+
+  /* It's been observed [1] that a client may lookup a private ~mdsdir inode.
+   * I do not have an explanation for how that happened organically but this
+   * check will ensure that the client can no longer do that.
+   *
+   * [1] https://tracker.ceph.com/issues/49922
+   */
+  if (_ino < MDS_INO_SYSTEM_BASE && _ino != MDS_INO_ROOT) {
+    respond_to_request(mdr, -CEPHFS_ESTALE);
+    return;
+  }
+
   CInode *in = mdcache->get_inode(ino);
   if (in && in->state_test(CInode::STATE_PURGING)) {
     respond_to_request(mdr, -CEPHFS_ESTALE);