Skip to content

Commit

Permalink
ovl: switch to mounter creds in readdir
Browse files Browse the repository at this point in the history
In preparation for more permission checking, override credentials for
directory operations on the underlying filesystems.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
  • Loading branch information
Miklos Szeredi committed Jun 2, 2020
1 parent 130fdbc commit 48bd024
Showing 1 changed file with 21 additions and 6 deletions.
27 changes: 21 additions & 6 deletions fs/overlayfs/readdir.c
Expand Up @@ -743,8 +743,10 @@ static int ovl_iterate(struct file *file, struct dir_context *ctx)
struct ovl_dir_file *od = file->private_data;
struct dentry *dentry = file->f_path.dentry;
struct ovl_cache_entry *p;
const struct cred *old_cred;
int err;

old_cred = ovl_override_creds(dentry->d_sb);
if (!ctx->pos)
ovl_dir_reset(file);

Expand All @@ -758,17 +760,20 @@ static int ovl_iterate(struct file *file, struct dir_context *ctx)
(ovl_same_fs(dentry->d_sb) &&
(ovl_is_impure_dir(file) ||
OVL_TYPE_MERGE(ovl_path_type(dentry->d_parent))))) {
return ovl_iterate_real(file, ctx);
err = ovl_iterate_real(file, ctx);
} else {
err = iterate_dir(od->realfile, ctx);
}
return iterate_dir(od->realfile, ctx);
goto out;
}

if (!od->cache) {
struct ovl_dir_cache *cache;

cache = ovl_cache_get(dentry);
err = PTR_ERR(cache);
if (IS_ERR(cache))
return PTR_ERR(cache);
goto out;

od->cache = cache;
ovl_seek_cursor(od, ctx->pos);
Expand All @@ -780,15 +785,18 @@ static int ovl_iterate(struct file *file, struct dir_context *ctx)
if (!p->ino) {
err = ovl_cache_update_ino(&file->f_path, p);
if (err)
return err;
goto out;
}
if (!dir_emit(ctx, p->name, p->len, p->ino, p->type))
break;
}
od->cursor = p->l_node.next;
ctx->pos++;
}
return 0;
err = 0;
out:
revert_creds(old_cred);
return err;
}

static loff_t ovl_dir_llseek(struct file *file, loff_t offset, int origin)
Expand Down Expand Up @@ -834,7 +842,14 @@ static loff_t ovl_dir_llseek(struct file *file, loff_t offset, int origin)
static struct file *ovl_dir_open_realfile(struct file *file,
struct path *realpath)
{
return ovl_path_open(realpath, O_RDONLY | (file->f_flags & O_LARGEFILE));
struct file *res;
const struct cred *old_cred;

old_cred = ovl_override_creds(file_inode(file)->i_sb);
res = ovl_path_open(realpath, O_RDONLY | (file->f_flags & O_LARGEFILE));
revert_creds(old_cred);

return res;
}

static int ovl_dir_fsync(struct file *file, loff_t start, loff_t end,
Expand Down

0 comments on commit 48bd024

Please sign in to comment.