projects
/
oweals
/
openssl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add the OSSL_PROVIDER_get_capabilities() API function
[oweals/openssl.git]
/
crypto
/
threads_pthread.c
diff --git
a/crypto/threads_pthread.c
b/crypto/threads_pthread.c
index 5a59779ebbb1d9b15267c35b74e907d467b12d6c..8b60251e776714d912bf773d6ca075105b55c4c8 100644
(file)
--- a/
crypto/threads_pthread.c
+++ b/
crypto/threads_pthread.c
@@
-1,7
+1,7
@@
/*
/*
- * Copyright 2016-20
18
The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2016-20
20
The OpenSSL Project Authors. All Rights Reserved.
*
*
- * Licensed under the
OpenSSL license
(the "License"). You may not use
+ * Licensed under the
Apache License 2.0
(the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
@@
-10,8
+10,17
@@
#include <openssl/crypto.h>
#include "internal/cryptlib.h"
#include <openssl/crypto.h>
#include "internal/cryptlib.h"
+#if defined(__sun)
+# include <atomic.h>
+#endif
+
#if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) && !defined(OPENSSL_SYS_WINDOWS)
#if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) && !defined(OPENSSL_SYS_WINDOWS)
+# if defined(OPENSSL_SYS_UNIX)
+# include <sys/types.h>
+# include <unistd.h>
+#endif
+
# ifdef PTHREAD_RWLOCK_INITIALIZER
# define USE_RWLOCK
# endif
# ifdef PTHREAD_RWLOCK_INITIALIZER
# define USE_RWLOCK
# endif
@@
-162,6
+171,12
@@
int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
*ret = __atomic_add_fetch(val, amount, __ATOMIC_ACQ_REL);
return 1;
}
*ret = __atomic_add_fetch(val, amount, __ATOMIC_ACQ_REL);
return 1;
}
+# elif defined(__sun) && (defined(__SunOS_5_10) || defined(__SunOS_5_11))
+ /* This will work for all future Solaris versions. */
+ if (ret != NULL) {
+ *ret = atomic_add_int_nv((volatile unsigned int *)val, amount);
+ return 1;
+ }
# endif
if (!CRYPTO_THREAD_write_lock(lock))
return 0;
# endif
if (!CRYPTO_THREAD_write_lock(lock))
return 0;
@@
-175,7
+190,10
@@
int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
return 1;
}
return 1;
}
-# ifdef OPENSSL_SYS_UNIX
+# ifndef FIPS_MODULE
+/* TODO(3.0): No fork protection in FIPS module yet! */
+
+# ifdef OPENSSL_SYS_UNIX
static pthread_once_t fork_once_control = PTHREAD_ONCE_INIT;
static void fork_once_func(void)
static pthread_once_t fork_once_control = PTHREAD_ONCE_INIT;
static void fork_once_func(void)
@@
-183,14
+201,20
@@
static void fork_once_func(void)
pthread_atfork(OPENSSL_fork_prepare,
OPENSSL_fork_parent, OPENSSL_fork_child);
}
pthread_atfork(OPENSSL_fork_prepare,
OPENSSL_fork_parent, OPENSSL_fork_child);
}
-# endif
+#
endif
int openssl_init_fork_handlers(void)
{
int openssl_init_fork_handlers(void)
{
-# ifdef OPENSSL_SYS_UNIX
+#
ifdef OPENSSL_SYS_UNIX
if (pthread_once(&fork_once_control, fork_once_func) == 0)
return 1;
if (pthread_once(&fork_once_control, fork_once_func) == 0)
return 1;
-# endif
+#
endif
return 0;
}
return 0;
}
+# endif /* FIPS_MODULE */
+
+int openssl_get_fork_id(void)
+{
+ return getpid();
+}
#endif
#endif