f2fs crypto: replace some BUG_ON()'s with error checks
Subsystems (3)
PATCH 1/3 f2fs crypto: replace some BUG_ON()'s with error checks
From: Jaegeuk Kim <[email protected]>
commit 66aa3e1274fcf887e9d6501a68163270fc7718e7 upstream. Please apply to 4.4-stable.
This patch adopts:
ext4 crypto: replace some BUG_ON()'s with error checks
--- fs/f2fs/crypto.c | 1 - fs/f2fs/crypto_fname.c | 2 -- fs/f2fs/crypto_key.c | 15 ++++++++++++--- 3 files changed, 12 insertions(+), 6 deletions(-)
fs/f2fs/crypto.c +0 -1
@@ -362,7 +362,6 @@ static int f2fs_page_crypto(struct f2fs_crypto_ctx *ctx,else res =crypto_ablkcipher_encrypt (req);if (res == -EINPROGRESS || res == -EBUSY ) { -BUG_ON (req->base.data != &ecr);wait_for_completion (&ecr.completion); res = ecr.res; }
fs/f2fs/crypto_fname.c +0 -2
@@ -124,7 +124,6 @@ static int f2fs_fname_encrypt(struct inode *inode,ablkcipher_request_set_crypt (req, &src_sg, &dst_sg, ciphertext_len, iv); res =crypto_ablkcipher_encrypt (req);if (res == -EINPROGRESS || res == -EBUSY ) { -BUG_ON (req->base.data != &ecr);wait_for_completion (&ecr.completion); res = ecr.res; }
@@ -180,7 +179,6 @@ static int f2fs_fname_decrypt(struct inode *inode,ablkcipher_request_set_crypt (req, &src_sg, &dst_sg, iname->len, iv); res =crypto_ablkcipher_decrypt (req);if (res == -EINPROGRESS || res == -EBUSY ) { -BUG_ON (req->base.data != &ecr);wait_for_completion (&ecr.completion); res = ecr.res; }
fs/f2fs/crypto_key.c +12 -3
@@ -75,7 +75,6 @@ static int f2fs_derive_key_aes(char deriving_key[F2FS_AES_128_ECB_KEY_SIZE], F2FS_AES_256_XTS_KEY_SIZE, NULL); res =crypto_ablkcipher_encrypt (req);if (res == -EINPROGRESS || res == -EBUSY ) { -BUG_ON (req->base.data != &ecr);wait_for_completion (&ecr.completion); res = ecr.res; }
@@ -189,7 +188,11 @@ int f2fs_get_encryption_info(struct inode *inode) keyring_key =NULL ; goto out; } -BUG_ON (keyring_key->type != &key_type_logon); +if (keyring_key->type != &key_type_logon) { +printk_once (KERN_WARNING "f2fs: key type must be logon\n" ); + res = -ENOKEY ; + goto out; + } ukp =user_key_payload (keyring_key);if (ukp->datalen !=sizeof (struct f2fs_encryption_key )) { res = -EINVAL ;
@@ -198,7 +201,13 @@ int f2fs_get_encryption_info(struct inode *inode) master_key = (struct f2fs_encryption_key *)ukp->data;BUILD_BUG_ON (F2FS_AES_128_ECB_KEY_SIZE !=F2FS_KEY_DERIVATION_NONCE_SIZE ); -BUG_ON (master_key->size !=F2FS_AES_256_XTS_KEY_SIZE ); +if (master_key->size !=F2FS_AES_256_XTS_KEY_SIZE ) { +printk_once (KERN_WARNING +"f2fs: key size incorrect: %d\n" , + master_key->size); + res = -ENOKEY ; + goto out; + } res =f2fs_derive_key_aes (ctx.nonce, master_key->raw, raw_key);if (res)
Signature · 1 line
2.15.0.rc0.271.g36b669edcc-goog
PATCH 2/3 f2fs crypto: add missing locking for keyring_key access
From: Jaegeuk Kim <[email protected]>
commit 745e8490b1e960ad79859dd8ba6a0b5a8d3d994e upstream. Please apply to 4.4-stable.
This patch adopts:
ext4 crypto: add missing locking for keyring_key access
--- fs/f2fs/crypto_key.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/f2fs/crypto_key.c +4 -0
@@ -193,9 +193,11 @@ int f2fs_get_encryption_info(struct inode *inode) res = -ENOKEY ; goto out; } +down_read (&keyring_key->sem); ukp =user_key_payload (keyring_key);if (ukp->datalen !=sizeof (struct f2fs_encryption_key )) { res = -EINVAL ; +up_read (&keyring_key->sem); goto out; } master_key = (struct f2fs_encryption_key *)ukp->data;
@@ -206,10 +208,12 @@ int f2fs_get_encryption_info(struct inode *inode)"f2fs: key size incorrect: %d\n" , master_key->size); res = -ENOKEY ; +up_read (&keyring_key->sem); goto out; } res =f2fs_derive_key_aes (ctx.nonce, master_key->raw, raw_key); +up_read (&keyring_key->sem);if (res) goto out;
Signature · 1 line
2.15.0.rc0.271.g36b669edcc-goog
PATCH 3/3 fscrypt: fix dereference of NULL user_key_payload
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
commit d60b5b7854c3d135b869f74fb93eaf63cbb1991a upstream. Please apply to 4.4-stable.
When an fscrypt-encrypted file is opened, we request the file's master key from the keyrings service as a logon key, then access its payload. However, a revoked key has a NULL payload, and we failed to check for this. request_key() *does* skip revoked keys, but there is still a window where the key can be revoked before we acquire its semaphore.
Fix it by checking for a NULL payload, treating it like a key which was already revoked at the time it was requested.
--- fs/ext4/crypto_key.c | 6 ++++++ fs/f2fs/crypto_key.c | 6 ++++++ 2 files changed, 12 insertions(+)
fs/ext4/crypto_key.c +6 -0
@@ -204,6 +204,12 @@ int ext4_get_encryption_info(struct inode *inode) }down_read (&keyring_key->sem); ukp =user_key_payload (keyring_key); +if (!ukp) { +/* key was revoked before we acquired its semaphore */ + res = -EKEYREVOKED ; +up_read (&keyring_key->sem); + goto out; + }if (ukp->datalen !=sizeof (struct ext4_encryption_key )) { res = -EINVAL ;up_read (&keyring_key->sem);
fs/f2fs/crypto_key.c +6 -0
@@ -195,6 +195,12 @@ int f2fs_get_encryption_info(struct inode *inode) }down_read (&keyring_key->sem); ukp =user_key_payload (keyring_key); +if (!ukp) { +/* key was revoked before we acquired its semaphore */ + res = -EKEYREVOKED ; +up_read (&keyring_key->sem); + goto out; + }if (ukp->datalen !=sizeof (struct f2fs_encryption_key )) { res = -EINVAL ;up_read (&keyring_key->sem);
Signature · 1 line
2.15.0.rc0.271.g36b669edcc-goog
Quoted 4 lines · Eric Biggers
From: Jaegeuk Kim <[email protected]>
commit
66aa3e1274fcf887e9d6501a68163270fc7718e7upstream. Please apply to 4.4-stable.
Thanks for all 3 of these patches, now queued up.
greg k-h