From: Xiubo Li Date: Fri, 9 Sep 2022 03:36:31 +0000 (+0800) Subject: client: check the cephx mds auth access for setattr X-Git-Tag: v18.2.4~114^2~14 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=9ac9bace1021c065d0ff9bc67be2d5fc84dd9e56;p=ceph.git client: check the cephx mds auth access for setattr If couldn't get the absolute path string we need to force it to do the sync setattr. Fixes: https://tracker.ceph.com/issues/57154 Signed-off-by: Xiubo Li (cherry picked from commit c1bf8d88e9d41c275fbae824c799d41d39d3ab4a) --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 95ebb50046b3f..8696bbc5880db 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -7993,6 +7993,8 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, bool kill_sguid = false; int inode_drop = 0; size_t auxsize = 0; + filepath path; + MetaRequest *req; if (aux) auxsize = aux->size(); @@ -8041,6 +8043,23 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, mask |= CEPH_SETATTR_CTIME; } + bool do_sync = true; + int res; + { + std::string path; + res = in->make_path_string(path); + if (res) { + ldout(cct, 20) << " absolute path: " << path << dendl; + if (path.length()) + path = path.substr(1); // drop leading / + res = mds_check_access(path, perms, MAY_WRITE); + if (res) { + goto out; + } + do_sync = false; + } + } + if (!mask) { // caller just needs us to bump the ctime in->ctime = ceph_clock_now(); @@ -8063,7 +8082,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, if (mask & CEPH_SETATTR_UID) { ldout(cct,10) << "changing uid to " << stx->stx_uid << dendl; - if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { + if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { in->ctime = ceph_clock_now(); in->cap_dirtier_uid = perms.uid(); in->cap_dirtier_gid = perms.gid(); @@ -8083,7 +8102,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, if (mask & CEPH_SETATTR_GID) { ldout(cct,10) << "changing gid to " << stx->stx_gid << dendl; - if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { + if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { in->ctime = ceph_clock_now(); in->cap_dirtier_uid = perms.uid(); in->cap_dirtier_gid = perms.gid(); @@ -8103,7 +8122,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, if (mask & CEPH_SETATTR_MODE) { ldout(cct,10) << "changing mode to " << stx->stx_mode << dendl; - if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { + if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { in->ctime = ceph_clock_now(); in->cap_dirtier_uid = perms.uid(); in->cap_dirtier_gid = perms.gid(); @@ -8117,7 +8136,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, } else { mask &= ~CEPH_SETATTR_MODE; } - } else if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL) && S_ISREG(in->mode)) { + } else if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL) && S_ISREG(in->mode)) { if (kill_sguid && (in->mode & (S_IXUSR|S_IXGRP|S_IXOTH))) { in->mode &= ~(S_ISUID|S_ISGID); } else { @@ -8135,7 +8154,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, if (mask & CEPH_SETATTR_BTIME) { ldout(cct,10) << "changing btime to " << in->btime << dendl; - if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { + if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { in->ctime = ceph_clock_now(); in->cap_dirtier_uid = perms.uid(); in->cap_dirtier_gid = perms.gid(); @@ -8155,7 +8174,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, ldout(cct,10) << "resetting cached fscrypt_auth field. size now " << in->fscrypt_auth.size() << dendl; - if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { + if (!do_sync && in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) { in->ctime = ceph_clock_now(); in->cap_dirtier_uid = perms.uid(); in->cap_dirtier_gid = perms.gid(); @@ -8178,7 +8197,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, } ldout(cct,10) << "changing size to " << stx->stx_size << dendl; - if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL) && + if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_EXCL) && !(mask & CEPH_SETATTR_KILL_SGUID) && stx->stx_size >= in->size) { if (stx->stx_size > in->size) { @@ -8203,7 +8222,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, ldout(cct,10) << "resetting cached fscrypt_file field. size now " << in->fscrypt_file.size() << dendl; - if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { + if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { in->ctime = ceph_clock_now(); in->cap_dirtier_uid = perms.uid(); in->cap_dirtier_gid = perms.gid(); @@ -8219,7 +8238,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, } if (mask & CEPH_SETATTR_MTIME) { - if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { + if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { in->mtime = utime_t(stx->stx_mtime); in->ctime = ceph_clock_now(); in->cap_dirtier_uid = perms.uid(); @@ -8227,7 +8246,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, in->time_warp_seq++; in->mark_caps_dirty(CEPH_CAP_FILE_EXCL); mask &= ~CEPH_SETATTR_MTIME; - } else if (in->caps_issued_mask(CEPH_CAP_FILE_WR) && + } else if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_WR) && utime_t(stx->stx_mtime) > in->mtime) { in->mtime = utime_t(stx->stx_mtime); in->ctime = ceph_clock_now(); @@ -8246,7 +8265,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, } if (mask & CEPH_SETATTR_ATIME) { - if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { + if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) { in->atime = utime_t(stx->stx_atime); in->ctime = ceph_clock_now(); in->cap_dirtier_uid = perms.uid(); @@ -8254,7 +8273,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, in->time_warp_seq++; in->mark_caps_dirty(CEPH_CAP_FILE_EXCL); mask &= ~CEPH_SETATTR_ATIME; - } else if (in->caps_issued_mask(CEPH_CAP_FILE_WR) && + } else if (!do_sync && in->caps_issued_mask(CEPH_CAP_FILE_WR) && utime_t(stx->stx_atime) > in->atime) { in->atime = utime_t(stx->stx_atime); in->ctime = ceph_clock_now(); @@ -8283,9 +8302,7 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, return 0; } - MetaRequest *req = new MetaRequest(CEPH_MDS_OP_SETATTR); - - filepath path; + req = new MetaRequest(CEPH_MDS_OP_SETATTR); in->make_nosnap_relative_path(path); req->set_filepath(path); @@ -8301,7 +8318,9 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask, req->head.args.setattr.mask = mask; req->regetattr_mask = mask; - int res = make_request(req, perms, inp); + res = make_request(req, perms, inp); + +out: ldout(cct, 10) << "_setattr result=" << res << dendl; return res; }