#include <openssl/crypto.h>
+/*
+ * Initialisation of global data should never happen via "RUN_ONCE" inside the
+ * FIPS module. Global data should instead always be associated with a specific
+ * OPENSSL_CTX object. In this way data will get cleaned up correctly when the
+ * module gets unloaded.
+ */
+#ifndef FIPS_MODE
/*
* DEFINE_RUN_ONCE: Define an initialiser function that should be run exactly
* once. It takes no arguments and returns and int result (1 for success or
* return 0;
* }
*/
-#define DEFINE_RUN_ONCE(init) \
+# define DEFINE_RUN_ONCE(init) \
static int init(void); \
int init##_ossl_ret_ = 0; \
void init##_ossl_(void) \
* DECLARE_RUN_ONCE: Declare an initialiser function that should be run exactly
* once that has been defined in another file via DEFINE_RUN_ONCE().
*/
-#define DECLARE_RUN_ONCE(init) \
+# define DECLARE_RUN_ONCE(init) \
extern int init##_ossl_ret_; \
void init##_ossl_(void);
* return 0;
* }
*/
-#define DEFINE_RUN_ONCE_STATIC(init) \
+# define DEFINE_RUN_ONCE_STATIC(init) \
static int init(void); \
static int init##_ossl_ret_ = 0; \
static void init##_ossl_(void) \
* return 0;
* }
*/
-#define DEFINE_RUN_ONCE_STATIC_ALT(initalt, init) \
+# define DEFINE_RUN_ONCE_STATIC_ALT(initalt, init) \
static int initalt(void); \
static void initalt##_ossl_(void) \
{ \
*
* (*) by convention, since the init function must return 1 on success.
*/
-#define RUN_ONCE(once, init) \
+# define RUN_ONCE(once, init) \
(CRYPTO_THREAD_run_once(once, init##_ossl_) ? init##_ossl_ret_ : 0)
/*
*
* (*) by convention, since the init function must return 1 on success.
*/
-#define RUN_ONCE_ALT(once, initalt, init) \
+# define RUN_ONCE_ALT(once, initalt, init) \
(CRYPTO_THREAD_run_once(once, initalt##_ossl_) ? init##_ossl_ret_ : 0)
+
+#endif /* FIPS_MODE */