From 89c511356125f892477ef42bd14c0b447ff06106 Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Wed, 7 Apr 2021 19:37:26 +0800 Subject: [PATCH] client: don't allow access to MDS-private inodes Fixes: https://tracker.ceph.com/issues/50112 Signed-off-by: Xiubo Li --- src/client/Client.cc | 17 +++++++++++++++++ src/client/Client.h | 1 + 2 files changed, 18 insertions(+) diff --git a/src/client/Client.cc b/src/client/Client.cc index d155341fdc3a6..33399629c5556 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -156,6 +156,14 @@ void client_flush_set_callback(void *p, ObjectCacher::ObjectSet *oset) client->flush_set_callback(oset); } +bool Client::is_reserved_vino(vinodeno_t &vino) { + if (vino.ino < MDS_INO_SYSTEM_BASE && vino.ino != MDS_INO_ROOT) { + ldout(cct, -1) << __func__ << "attempt to access reserved inode number " << vino << dendl; + return true; + } + return false; +} + // ------------- @@ -9150,6 +9158,9 @@ int Client::_lookup_vino(vinodeno_t vino, const UserPerm& perms, Inode **inode) if (!mref_reader.is_state_satisfied()) return -CEPHFS_ENOTCONN; + if (is_reserved_vino(vino)) + return -CEPHFS_ESTALE; + MetaRequest *req = new MetaRequest(CEPH_MDS_OP_LOOKUPINO); filepath path(vino.ino); req->set_filepath(path); @@ -11406,6 +11417,9 @@ int Client::ll_lookup_vino( if (!mref_reader.is_state_satisfied()) return -CEPHFS_ENOTCONN; + if (is_reserved_vino(vino)) + return -CEPHFS_ESTALE; + std::scoped_lock lock(client_lock); ldout(cct, 3) << __func__ << " " << vino << dendl; @@ -11660,6 +11674,9 @@ Inode *Client::ll_get_inode(vinodeno_t vino) if (!mref_reader.is_state_satisfied()) return NULL; + if (is_reserved_vino(vino)) + return NULL; + std::scoped_lock lock(client_lock); unordered_map::iterator p = inode_map.find(vino); diff --git a/src/client/Client.h b/src/client/Client.h index 011ff1ad07b9a..48fad7f61ba96 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -1223,6 +1223,7 @@ private: static const VXattr _common_vxattrs[]; + bool is_reserved_vino(vinodeno_t &vino); void fill_dirent(struct dirent *de, const char *name, int type, uint64_t ino, loff_t next_off); -- 2.39.5