restrict who can setxattr the pseudo file. closes #64

This commit is contained in:
Antonio SJ Musumeci 2015-03-13 20:31:02 -04:00
parent 4ea49fcfbb
commit 4b204b8fba
2 changed files with 16 additions and 11 deletions

View File

@ -48,10 +48,10 @@ _getattr_controlfile(struct stat &buf)
buf.st_dev = 0; buf.st_dev = 0;
buf.st_ino = 0; buf.st_ino = 0;
buf.st_mode = (S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); buf.st_mode = (S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
buf.st_nlink = 1; buf.st_nlink = 1;
buf.st_uid = ::geteuid(); buf.st_uid = ::getuid();
buf.st_gid = ::getegid(); buf.st_gid = ::getgid();
buf.st_rdev = 0; buf.st_rdev = 0;
buf.st_size = 0; buf.st_size = 0;
buf.st_blksize = 1024; buf.st_blksize = 1024;

View File

@ -282,18 +282,23 @@ namespace mergerfs
size_t attrvalsize, size_t attrvalsize,
int flags) int flags)
{ {
const config::Config &config = config::get(); const config::Config &config = config::get();
const struct fuse_context *fc = fuse_get_context();
if(fusepath == config.controlfile) if(fusepath == config.controlfile)
return _setxattr_controlfile(config::get_writable(), {
attrname, if((fc->uid != ::getuid()) && (fc->gid != ::getgid()))
string(attrval,attrvalsize), return -EPERM;
flags);
return _setxattr_controlfile(config::get_writable(),
attrname,
string(attrval,attrvalsize),
flags);
}
{ {
const struct fuse_context *fc = fuse_get_context(); const ugid::SetResetGuard ugid(fc->uid,fc->gid);
const ugid::SetResetGuard ugid(fc->uid,fc->gid); const rwlock::ReadGuard readlock(&config.srcmountslock);
const rwlock::ReadGuard readlock(&config.srcmountslock);
return _setxattr(*config.setxattr, return _setxattr(*config.setxattr,
config.srcmounts, config.srcmounts,