• Eric Biggers's avatar
    fscrypt: allow deleting files with unsupported encryption policy · a14d0b67
    Eric Biggers authored
    Currently it's impossible to delete files that use an unsupported
    encryption policy, as the kernel will just return an error when
    performing any operation on the top-level encrypted directory, even just
    a path lookup into the directory or opening the directory for readdir.
    
    More specifically, this occurs in any of the following cases:
    
    - The encryption context has an unrecognized version number.  Current
      kernels know about v1 and v2, but there could be more versions in the
      future.
    
    - The encryption context has unrecognized encryption modes
      (FSCRYPT_MODE_*) or flags (FSCRYPT_POLICY_FLAG_*), an unrecognized
      combination of modes, or reserved bits set.
    
    - The encryption key has been added and the encryption modes are
      recognized but aren't available in the crypto API -- for example, a
      directory is encrypted with FSCRYPT_MODE_ADIANTUM but the kernel
      doesn't have CONFIG_CRYPTO_ADIANTUM enabled.
    
    It's desirable to return errors for most operations on files that use an
    unsupported encryption policy, but the current behavior is too strict.
    We need to allow enough to delete files, so that people can't be stuck
    with undeletable files when downgrading kernel versions.  That includes
    allowing directories to be listed and allowing dentries to be looked up.
    
    Fix this by modifying the key setup logic to treat an unsupported
    encryption policy in the same way as "key unavailable" in the cases that
    are required for a recursive delete to work: preparing for a readdir or
    a dentry lookup, revalidating a dentry, or checking whether an inode has
    the same encryption policy as its parent directory.
    Reviewed-by: default avatarAndreas Dilger <adilger@dilger.ca>
    Link: https://lore.kernel.org/r/20201203022041.230976-10-ebiggers@kernel.orgSigned-off-by: default avatarEric Biggers <ebiggers@google.com>
    a14d0b67
fname.c 18.6 KB