Blob Blame History Raw
From: Patrick Steuer <patrick.steuer@de.ibm.com>
Subject: s390/crypto: Fix kernel crash on aes_s390 module remove.
Patch-mainline: v4.17-rc1
Git-commit: c7260ca335a09fb186885c80bd6022318c10c541
References: FATE#325686, LTC#146004, bsc#1113485

Summary:     kernel: in-kernel crypto: gcm enhancements
Description: add support for z14's kma instruction to accelerate aes-gcm

Upstream-Description:

             s390/crypto: Fix kernel crash on aes_s390 module remove.

             A kernel crash occurs when the aes_s390 kernel module is
             removed on machines < z14. This only happens on kernel
             version 4.15 and higher on machines not supporting MSA 8.

             The reason for the crash is a unconditional
             crypto_unregister_aead() invocation where no previous
             crypto_register_aead() had been called. The fix now
             remembers if there has been a successful registration and
             only then calls the unregister function upon kernel module
             remove.

             The code now crashing has been introduced with
             "bf7fa03 s390/crypto: add s390 platform specific aes gcm support."

             Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com>
             Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

Signed-off-by: Patrick Steuer <patrick.steuer@de.ibm.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 arch/s390/crypto/aes_s390.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

--- a/arch/s390/crypto/aes_s390.c
+++ b/arch/s390/crypto/aes_s390.c
@@ -1052,6 +1052,7 @@ static struct aead_alg gcm_aes_aead = {
 
 static struct crypto_alg *aes_s390_algs_ptr[5];
 static int aes_s390_algs_num;
+static struct aead_alg *aes_s390_aead_alg;
 
 static int aes_s390_register_alg(struct crypto_alg *alg)
 {
@@ -1070,7 +1071,8 @@ static void aes_s390_fini(void)
 	if (ctrblk)
 		free_page((unsigned long) ctrblk);
 
-	crypto_unregister_aead(&gcm_aes_aead);
+	if (aes_s390_aead_alg)
+		crypto_unregister_aead(aes_s390_aead_alg);
 }
 
 static int __init aes_s390_init(void)
@@ -1128,6 +1130,7 @@ static int __init aes_s390_init(void)
 		ret = crypto_register_aead(&gcm_aes_aead);
 		if (ret)
 			goto out_err;
+		aes_s390_aead_alg = &gcm_aes_aead;
 	}
 
 	return 0;