Check if file is opened with O_DIRECT.
Check if the file is a regular file.
If missing read permission return EACCES instead of EBADF.

https://jira.sw.ru/browse/PSBM-142046
Signed-off-by: Alexander Atanasov <alexander.atana...@virtuozzo.com>
---
 drivers/md/dm-ploop-target.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c
index bc4a801ca3a8..0e074b29e823 100644
--- a/drivers/md/dm-ploop-target.c
+++ b/drivers/md/dm-ploop-target.c
@@ -188,16 +188,32 @@ static void ploop_destroy(struct ploop *ploop)
 static struct file *ploop_get_delta_file(int fd)
 {
        struct file *file;
+       int ret;
 
        file = fget(fd);
        if (!file)
                return ERR_PTR(-ENOENT);
+
+       if (!S_ISREG(file_inode(file)->i_mode)) {
+               ret = -EINVAL;
+               goto out_err;
+       }
+
+       if (!(file->f_flags & O_DIRECT)) {
+               ret = -EINVAL;
+               goto out_err;
+       }
+
        if (!(file->f_mode & FMODE_READ)) {
-               fput(file);
-               return ERR_PTR(-EBADF);
+               ret = -EACCES;
+               goto out_err;
        }
 
        return file;
+out_err:
+       fput(file);
+       return ERR_PTR(ret);
+
 }
 ALLOW_ERROR_INJECTION(ploop_get_delta_file, ERRNO_NULL);
 
-- 
2.31.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to