ext4: handle decryption error in __ext4_block_zero_page_range()
authorEric Biggers <ebiggers@google.com>
Thu, 26 Dec 2019 15:41:05 +0000 (09:41 -0600)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 17 Jan 2020 21:24:53 +0000 (16:24 -0500)
fscrypt_decrypt_pagecache_blocks() can fail, because it uses
skcipher_request_alloc(), which uses kmalloc(), which can fail; and also
because it calls crypto_skcipher_decrypt(), which can fail depending on
the driver that actually implements the crypto.

Therefore it's not appropriate to WARN on decryption error in
__ext4_block_zero_page_range().

Remove the WARN and just handle the error instead.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Link: https://lore.kernel.org/r/20191226154105.4704-1-ebiggers@kernel.org
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c

index 9100460..d3e1539 100644 (file)
@@ -3725,8 +3725,12 @@ static int __ext4_block_zero_page_range(handle_t *handle,
                if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode)) {
                        /* We expect the key to be set. */
                        BUG_ON(!fscrypt_has_encryption_key(inode));
-                       WARN_ON_ONCE(fscrypt_decrypt_pagecache_blocks(
-                                       page, blocksize, bh_offset(bh)));
+                       err = fscrypt_decrypt_pagecache_blocks(page, blocksize,
+                                                              bh_offset(bh));
+                       if (err) {
+                               clear_buffer_uptodate(bh);
+                               goto unlock;
+                       }
                }
        }
        if (ext4_should_journal_data(inode)) {