client/fuse: handle case of renameat2 with non-zero flags

When user issues renameat(2) with non-zero flags (RENAME_EXCHANGE or
RENAME_NOREPALCE) the current code ignores those flags and treat the
call as ordinary rename. This, in turn, may yield successful rename with
wrong semantics then those expected by the caller.

Follow the same semantics as kernel's cephfs client: return -EINVAL when
having non-zero flags to renameat2 (see 'ceph_rename' at fs/ceph/dir.c).

Fixes: https://tracker.ceph.com/issues/63722

Signed-off-by: Shachar Sharon <ssharon@redhat.com>
This commit is contained in:
Shachar Sharon 2023-11-30 13:29:30 +02:00
parent cc1951a5d6
commit 19509ce650

View File

@ -753,6 +753,15 @@ static void fuse_ll_rename(fuse_req_t req, fuse_ino_t parent, const char *name,
#endif
)
{
#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0)
// cephfs does not support renameat2 flavors; follow same logic as done in
// kclient's ceph_rename()
if (flags) {
fuse_reply_err(req, get_sys_errno(CEPHFS_EINVAL));
return;
}
#endif
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
UserPerm perm(ctx->uid, ctx->gid);