lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 114/633] fscrypt: restrict IV_INO_LBLK_32 to ino_bits <= 32
    Date
    From: Eric Biggers <ebiggers@google.com>

    [ Upstream commit 5e895bd4d5233cb054447d0491d4e63c8496d419 ]

    When an encryption policy has the IV_INO_LBLK_32 flag set, the IV
    generation method involves hashing the inode number. This is different
    from fscrypt's other IV generation methods, where the inode number is
    either not used at all or is included directly in the IVs.

    Therefore, in principle IV_INO_LBLK_32 can work with any length inode
    number. However, currently fscrypt gets the inode number from
    inode::i_ino, which is 'unsigned long'. So currently the implementation
    limit is actually 32 bits (like IV_INO_LBLK_64), since longer inode
    numbers will have been truncated by the VFS on 32-bit platforms.

    Fix fscrypt_supported_v2_policy() to enforce the correct limit.

    This doesn't actually matter currently, since only ext4 and f2fs support
    IV_INO_LBLK_32, and they both only support 32-bit inode numbers. But we
    might as well fix it in case it matters in the future.

    Ideally inode::i_ino would instead be made 64-bit, but for now it's not
    needed. (Note, this limit does *not* prevent filesystems with 64-bit
    inode numbers from adding fscrypt support, since IV_INO_LBLK_* support
    is optional and is useful only on certain hardware.)

    Fixes: e3b1078bedd3 ("fscrypt: add support for IV_INO_LBLK_32 policies")
    Reported-by: Jeff Layton <jlayton@kernel.org>
    Link: https://lore.kernel.org/r/20200824203841.1707847-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/crypto/policy.c | 9 +++++++--
    1 file changed, 7 insertions(+), 2 deletions(-)

    diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c
    index d23ff162c78bc..0b32c64eb4053 100644
    --- a/fs/crypto/policy.c
    +++ b/fs/crypto/policy.c
    @@ -178,10 +178,15 @@ static bool fscrypt_supported_v2_policy(const struct fscrypt_policy_v2 *policy,
    32, 32))
    return false;

    + /*
    + * IV_INO_LBLK_32 hashes the inode number, so in principle it can
    + * support any ino_bits. However, currently the inode number is gotten
    + * from inode::i_ino which is 'unsigned long'. So for now the
    + * implementation limit is 32 bits.
    + */
    if ((policy->flags & FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32) &&
    - /* This uses hashed inode numbers, so ino_bits doesn't matter. */
    !supported_iv_ino_lblk_policy(policy, inode, "IV_INO_LBLK_32",
    - INT_MAX, 32))
    + 32, 32))
    return false;

    if (memchr_inv(policy->__reserved, 0, sizeof(policy->__reserved))) {
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 18:25    [W:3.175 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site