You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
eCryptfs: Do not allocate hash tfm in NORECLAIM context
You cannot allocate crypto tfm objects in NORECLAIM or NOFS contexts. The ecryptfs code currently does exactly that for the MD5 tfm. This patch fixes it by preallocating the MD5 tfm in a safe context. The MD5 tfm is also reentrant so this patch removes the superfluous cs_hash_tfm_mutex. Reported-by: Nicolas Boichat <drinkcat@chromium.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
+16
-16
@@ -105,19 +105,7 @@ static int ecryptfs_calculate_md5(char *dst,
|
||||
struct crypto_shash *tfm;
|
||||
int rc = 0;
|
||||
|
||||
mutex_lock(&crypt_stat->cs_hash_tfm_mutex);
|
||||
tfm = crypt_stat->hash_tfm;
|
||||
if (!tfm) {
|
||||
tfm = crypto_alloc_shash(ECRYPTFS_DEFAULT_HASH, 0, 0);
|
||||
if (IS_ERR(tfm)) {
|
||||
rc = PTR_ERR(tfm);
|
||||
ecryptfs_printk(KERN_ERR, "Error attempting to "
|
||||
"allocate crypto context; rc = [%d]\n",
|
||||
rc);
|
||||
goto out;
|
||||
}
|
||||
crypt_stat->hash_tfm = tfm;
|
||||
}
|
||||
rc = ecryptfs_hash_digest(tfm, src, len, dst);
|
||||
if (rc) {
|
||||
printk(KERN_ERR
|
||||
@@ -126,7 +114,6 @@ static int ecryptfs_calculate_md5(char *dst,
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&crypt_stat->cs_hash_tfm_mutex);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -207,16 +194,29 @@ out:
|
||||
*
|
||||
* Initialize the crypt_stat structure.
|
||||
*/
|
||||
void
|
||||
ecryptfs_init_crypt_stat(struct ecryptfs_crypt_stat *crypt_stat)
|
||||
int ecryptfs_init_crypt_stat(struct ecryptfs_crypt_stat *crypt_stat)
|
||||
{
|
||||
struct crypto_shash *tfm;
|
||||
int rc;
|
||||
|
||||
tfm = crypto_alloc_shash(ECRYPTFS_DEFAULT_HASH, 0, 0);
|
||||
if (IS_ERR(tfm)) {
|
||||
rc = PTR_ERR(tfm);
|
||||
ecryptfs_printk(KERN_ERR, "Error attempting to "
|
||||
"allocate crypto context; rc = [%d]\n",
|
||||
rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
memset((void *)crypt_stat, 0, sizeof(struct ecryptfs_crypt_stat));
|
||||
INIT_LIST_HEAD(&crypt_stat->keysig_list);
|
||||
mutex_init(&crypt_stat->keysig_list_mutex);
|
||||
mutex_init(&crypt_stat->cs_mutex);
|
||||
mutex_init(&crypt_stat->cs_tfm_mutex);
|
||||
mutex_init(&crypt_stat->cs_hash_tfm_mutex);
|
||||
crypt_stat->hash_tfm = tfm;
|
||||
crypt_stat->flags |= ECRYPTFS_STRUCT_INITIALIZED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user