mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-15 04:42:02 +00:00
48 lines
1.6 KiB
Diff
48 lines
1.6 KiB
Diff
From 05acefb4872dae89e772729efb194af754c877e8 Mon Sep 17 00:00:00 2001
|
|
From: Miklos Szeredi <mszeredi@redhat.com>
|
|
Date: Tue, 2 Jun 2020 22:20:26 +0200
|
|
Subject: ovl: check permission to open real file
|
|
|
|
Call inode_permission() on real inode before opening regular file on one of
|
|
the underlying layers.
|
|
|
|
In some cases ovl_permission() already checks access to an underlying file,
|
|
but it misses the metacopy case, and possibly other ones as well.
|
|
|
|
Removing the redundant permission check from ovl_permission() should be
|
|
considered later.
|
|
|
|
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
|
|
---
|
|
fs/overlayfs/file.c | 16 ++++++++++++++--
|
|
1 file changed, 14 insertions(+), 2 deletions(-)
|
|
|
|
Index: linux-5.4.147/fs/overlayfs/file.c
|
|
===================================================================
|
|
--- linux-5.4.147.orig/fs/overlayfs/file.c
|
|
+++ linux-5.4.147/fs/overlayfs/file.c
|
|
@@ -34,10 +34,22 @@ static struct file *ovl_open_realfile(co
|
|
struct file *realfile;
|
|
const struct cred *old_cred;
|
|
int flags = file->f_flags | OVL_OPEN_FLAGS;
|
|
+ int acc_mode = ACC_MODE(flags);
|
|
+ int err;
|
|
+
|
|
+ if (flags & O_APPEND)
|
|
+ acc_mode |= MAY_APPEND;
|
|
|
|
old_cred = ovl_override_creds(inode->i_sb);
|
|
- realfile = open_with_fake_path(&file->f_path, flags, realinode,
|
|
- current_cred());
|
|
+ err = inode_permission(realinode, MAY_OPEN | acc_mode);
|
|
+ if (err) {
|
|
+ realfile = ERR_PTR(err);
|
|
+ } else if (!inode_owner_or_capable(realinode)) {
|
|
+ realfile = ERR_PTR(-EPERM);
|
|
+ } else {
|
|
+ realfile = open_with_fake_path(&file->f_path, flags, realinode,
|
|
+ current_cred());
|
|
+ }
|
|
revert_creds(old_cred);
|
|
|
|
pr_debug("open(%p[%pD2/%c], 0%o) -> (%p, 0%o)\n",
|