lkml.org 
[lkml]   [2022]   [Jul]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC 3/4] fscrypt: add fscrypt_have_same_policy() to check inode's compatibility
    Date
    From: Omar Sandoval <osandov@osandov.com>

    btrfs will have the possibility of encrypted and unencrypted files in
    the same directory, and it's important to not allow these two files to
    become linked together. Therefore, add a function which allows checking
    the encryption policies of two inodes to ensure they are compatible.

    Signed-off-by: Omar Sandoval <osandov@osandov.com>
    Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@dorminy.me>
    ---
    fs/crypto/policy.c | 26 ++++++++++++++++++++++++++
    include/linux/fscrypt.h | 1 +
    2 files changed, 27 insertions(+)

    diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c
    index 5f858cee1e3b..5763462af9e8 100644
    --- a/fs/crypto/policy.c
    +++ b/fs/crypto/policy.c
    @@ -407,6 +407,32 @@ static int fscrypt_get_policy(struct inode *inode, union fscrypt_policy *policy)
    return fscrypt_policy_from_context(policy, &ctx, ret);
    }

    +/**
    + * fscrypt_have_same_policy() - check whether two inodes have the same policy
    + * @inode1: the first inode
    + * @inode2: the second inode
    + *
    + * Return: %true if equal, else %false
    + */
    +int fscrypt_have_same_policy(struct inode *inode1, struct inode *inode2)
    +{
    + union fscrypt_policy policy1, policy2;
    + int err;
    +
    + if (!IS_ENCRYPTED(inode1) && !IS_ENCRYPTED(inode2))
    + return true;
    + else if (!IS_ENCRYPTED(inode1) || !IS_ENCRYPTED(inode2))
    + return false;
    + err = fscrypt_get_policy(inode1, &policy1);
    + if (err)
    + return err;
    + err = fscrypt_get_policy(inode2, &policy2);
    + if (err)
    + return err;
    + return fscrypt_policies_equal(&policy1, &policy2);
    +}
    +EXPORT_SYMBOL(fscrypt_have_same_policy);
    +
    static int set_encryption_policy(struct inode *inode,
    const union fscrypt_policy *policy)
    {
    diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h
    index fb48961c46f6..1686b25f6d9c 100644
    --- a/include/linux/fscrypt.h
    +++ b/include/linux/fscrypt.h
    @@ -318,6 +318,7 @@ static inline struct page *fscrypt_pagecache_page(struct page *bounce_page)
    void fscrypt_free_bounce_page(struct page *bounce_page);

    /* policy.c */
    +int fscrypt_have_same_policy(struct inode *inode1, struct inode *inode2);
    int fscrypt_ioctl_set_policy(struct file *filp, const void __user *arg);
    int fscrypt_ioctl_get_policy(struct file *filp, void __user *arg);
    int fscrypt_ioctl_get_policy_ex(struct file *filp, void __user *arg);
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-07-24 02:53    [W:4.564 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site