lkml.org 
[lkml]   [2016]   [Apr]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.5 106/124] ext4 crypto: use dget_parent() in ext4_d_revalidate()
    Date
    4.5-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Theodore Ts'o <tytso@mit.edu>

    commit 3d43bcfef5f0548845a425365011c499875491b0 upstream.

    This avoids potential problems caused by a race where the inode gets
    renamed out from its parent directory and the parent directory is
    deleted while ext4_d_revalidate() is running.

    Fixes: 28b4c263961c
    Reported-by: Al Viro <viro@ZenIV.linux.org.uk>
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/ext4/crypto.c | 12 ++++++++----
    1 file changed, 8 insertions(+), 4 deletions(-)

    --- a/fs/ext4/crypto.c
    +++ b/fs/ext4/crypto.c
    @@ -475,13 +475,16 @@ uint32_t ext4_validate_encryption_key_si
    */
    static int ext4_d_revalidate(struct dentry *dentry, unsigned int flags)
    {
    - struct inode *dir = d_inode(dentry->d_parent);
    - struct ext4_crypt_info *ci = EXT4_I(dir)->i_crypt_info;
    + struct dentry *dir;
    + struct ext4_crypt_info *ci;
    int dir_has_key, cached_with_key;

    - if (!ext4_encrypted_inode(dir))
    + dir = dget_parent(dentry);
    + if (!ext4_encrypted_inode(d_inode(dir))) {
    + dput(dir);
    return 0;
    -
    + }
    + ci = EXT4_I(d_inode(dir))->i_crypt_info;
    if (ci && ci->ci_keyring_key &&
    (ci->ci_keyring_key->flags & ((1 << KEY_FLAG_INVALIDATED) |
    (1 << KEY_FLAG_REVOKED) |
    @@ -491,6 +494,7 @@ static int ext4_d_revalidate(struct dent
    /* this should eventually be an flag in d_flags */
    cached_with_key = dentry->d_fsdata != NULL;
    dir_has_key = (ci != NULL);
    + dput(dir);

    /*
    * If the dentry was cached without the key, and it is a

    \
     
     \ /
      Last update: 2016-04-18 05:41    [W:4.089 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site