SHA256
1
0
forked from pool/libica
libica/fix-msa-level-detection.patch
Stephan Kulow 053908a9ac Accepting request 484290 from openSUSE:Factory:zSystems
Major rework of package to conform to shared library policy, including being renamed from libica2 to libica.
Additional bugfixes from previous version.
Please also make me the maintainer of the package.

OBS-URL: https://build.opensuse.org/request/show/484290
OBS-URL: https://build.opensuse.org/package/show/devel:openSUSE:Factory/libica?expand=0&rev=1
2017-04-24 19:06:50 +00:00

76 lines
3.0 KiB
Diff

Subject: [PATCH] [BZ 148767] libica: libica crash with illegal instruction on z196/z114
From: Harald Freudenberger <freude@linux.vnet.ibm.com>
Description: libica: libica crash with illegal instruction on z196/z114
Symptom: 'illegal instruction' on libica initialization
Problem: Upon initialization libica checks all the MSA levels
of the system to find out the available functions.
This check function reuses a buffer variable without
proper reinitialization thus leading to detect an
MSA 5 function PPNO which is in fact not available
on z196/z114 systems. Upon initialization the libica
internal pseudo random generator is initialized which
is then trying to use this PPNO function and so
the 'illegal instruction' occurs.
Solution: Fix libica initialization function.
Reproduction: On z196/z114 systems with every libica version >= 2.6.
Upstream-ID: eeb40e5aea7dd36580629e6b17cd7f03fb62549c
Problem-ID: 148767
Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com>
Index: libica-service/src/s390_crypto.c
===================================================================
--- libica-service.orig/src/s390_crypto.c 2016-11-18 12:04:39.809574833 +0100
+++ libica-service/src/s390_crypto.c 2016-11-18 12:04:39.805574781 +0100
@@ -144,6 +144,8 @@ void set_switches(int msa)
* kimd query and do not need to over the whole array. Therfore there
* is also no distict setting of the switch needed in form
* msa4_switch = 1. */
+
+ /* kmc query */
memset(mask, 0, sizeof(mask));
if (msa) {
if (begin_sigill_section(&oldact, &oldset) == 0) {
@@ -160,13 +162,14 @@ void set_switches(int msa)
*s390_kmc_functions[n].enabled = on;
}
+ /* kimd query */
+ memset(mask, 0, sizeof(mask));
if (msa) {
if (begin_sigill_section(&oldact, &oldset) == 0) {
s390_kimd(S390_CRYPTO_QUERY, mask, (void *) 0, 0);
end_sigill_section(&oldact, &oldset);
}
}
-
for (n = 0; n < (sizeof(s390_kimd_functions) /
sizeof(s390_supported_function_t)); n++) {
if (S390_CRYPTO_TEST_MASK(mask, s390_kimd_functions[n].hw_fc))
@@ -176,6 +179,8 @@ void set_switches(int msa)
*s390_kimd_functions[n].enabled = on;
}
+ /* ppno query */
+ memset(mask, 0, sizeof(mask));
if (5 <= msa) {
msa5_switch = 1;
if (begin_sigill_section(&oldact, &oldset) == 0) {
@@ -183,7 +188,6 @@ void set_switches(int msa)
end_sigill_section(&oldact, &oldset);
}
}
-
for (n = 0; n < (sizeof(s390_ppno_functions) /
sizeof(s390_supported_function_t)); n++) {
if (S390_CRYPTO_TEST_MASK(mask, s390_ppno_functions[n].hw_fc))
@@ -254,7 +258,7 @@ libica_func_list_element_int icaList[] =
{RSA_KEY_GEN_ME, ADAPTER, 0, ICA_FLAG_SW, 0}, // SW (openssl)
{RSA_KEY_GEN_CRT, ADAPTER, 0, ICA_FLAG_SW, 0}, // SW (openssl)
- {SHA512_DRNG, PPNO, SHA512_DRNG_GEN, ICA_FLAG_SHW | ICA_FLAG_SW, 0},
+ {SHA512_DRNG, PPNO, SHA512_DRNG_GEN, ICA_FLAG_SW, 0},
/* available for the MSA4 instruction */
/* available for the RSA instruction */