Fix memory leak in GENERAL_NAME_set0_othername.
[openssl.git] / crypto / s390xcap.c
index ffbe0235f996214099aba8fdef2c7d1758e8a85c..cf8c372c05aaf5df291949415f8c6d4a257c4455 100644 (file)
@@ -3,35 +3,40 @@
 #include <string.h>
 #include <setjmp.h>
 #include <signal.h>
+#include "cryptlib.h"
 
-extern unsigned long OPENSSL_s390xcap_P;
+extern unsigned long OPENSSL_s390xcap_P[];
 
 static sigjmp_buf ill_jmp;
-static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); }
+static void ill_handler(int sig)
+{
+    siglongjmp(ill_jmp, sig);
+}
 
 unsigned long OPENSSL_s390x_facilities(void);
 
 void OPENSSL_cpuid_setup(void)
-       {
-       sigset_t oset;
-       struct sigaction ill_act,oact;
-
-       if (OPENSSL_s390xcap_P) return;
-
-       memset(&ill_act,0,sizeof(ill_act));
-       ill_act.sa_handler = ill_handler;
-       sigfillset(&ill_act.sa_mask);
-       sigdelset(&ill_act.sa_mask,SIGILL);
-       sigdelset(&ill_act.sa_mask,SIGTRAP);
-       sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset);
-       sigaction (SIGILL,&ill_act,&oact);
-
-       /* protection against missing store-facility-list-extended */
-       if (sigsetjmp(ill_jmp,0) == 0)
-               OPENSSL_s390xcap_P = OPENSSL_s390x_facilities();
-       else
-               OPENSSL_s390xcap_P = 1UL<<63;
-
-       sigaction (SIGILL,&oact,NULL);
-       sigprocmask(SIG_SETMASK,&oset,NULL);
-       }
+{
+    sigset_t oset;
+    struct sigaction ill_act, oact;
+
+    if (OPENSSL_s390xcap_P[0])
+        return;
+
+    OPENSSL_s390xcap_P[0] = 1UL << (8 * sizeof(unsigned long) - 1);
+
+    memset(&ill_act, 0, sizeof(ill_act));
+    ill_act.sa_handler = ill_handler;
+    sigfillset(&ill_act.sa_mask);
+    sigdelset(&ill_act.sa_mask, SIGILL);
+    sigdelset(&ill_act.sa_mask, SIGTRAP);
+    sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
+    sigaction(SIGILL, &ill_act, &oact);
+
+    /* protection against missing store-facility-list-extended */
+    if (sigsetjmp(ill_jmp, 1) == 0)
+        OPENSSL_s390x_facilities();
+
+    sigaction(SIGILL, &oact, NULL);
+    sigprocmask(SIG_SETMASK, &oset, NULL);
+}