if (r < 0)
goto out;
- /* 'name == NULL' means rmsnap */
+ /* 'name == NULL' means rmsnap w/o permission checks */
if (perms.uid() != 0 && name && (dir->mode & S_ISVTX)) {
InodeRef otherin;
r = _lookup(dir, name, CEPH_CAP_AUTH_SHARED, &otherin, perms);
return _mkdir(snapdir, name, mode, perm, nullptr, metadata);
}
-int Client::rmsnap(const char *relpath, const char *name, const UserPerm& perms)
+int Client::rmsnap(const char *relpath, const char *name, const UserPerm& perms, bool check_perms)
{
RWRef_t mref_reader(mount_state, CLIENT_MOUNTING);
if (!mref_reader.is_state_satisfied())
int r = path_walk(path, &in, perms);
if (r < 0)
return r;
+ Inode *snapdir = open_snapdir(in.get());
if (cct->_conf->client_permissions) {
- r = may_delete(in.get(), NULL, perms);
+ r = may_delete(snapdir, check_perms ? name : NULL, perms);
if (r < 0)
return r;
}
- Inode *snapdir = open_snapdir(in.get());
return _rmdir(snapdir, name, perms);
}
int mksnap(const char *path, const char *name, const UserPerm& perm,
mode_t mode=0, const std::map<std::string, std::string> &metadata={});
- int rmsnap(const char *path, const char *name, const UserPerm& perm);
+ int rmsnap(const char *path, const char *name, const UserPerm& perm, bool check_perms=false);
// Inode permission checking
int inode_permission(Inode *in, const UserPerm& perms, unsigned want);
{
if (!cmount->is_mounted())
return -ENOTCONN;
- return cmount->get_client()->rmsnap(path, name, cmount->default_perms);
+ return cmount->get_client()->rmsnap(path, name, cmount->default_perms, true);
}
extern "C" int ceph_mkdirs(struct ceph_mount_info *cmount, const char *path, mode_t mode)