return;
}
-#define ONCE_UNINITED 0
-#define ONCE_ININIT 1
-#define ONCE_DONE 2
+struct init_once_cb_info {
+ void (*init)(void);
+};
-/*
- * We don't use InitOnceExecuteOnce because that isn't available in WinXP which
- * we still have to support.
- */
-int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void))
+static BOOL CALLBACK init_wrapper(PINIT_ONCE InitOnce, PVOID param, PVOID *context)
{
- LONG volatile *lock = (LONG *)once;
- LONG result;
+ struct init_once_cb_info *info = (struct init_once_cb_info *)param;
- if (*lock == ONCE_DONE)
- return 1;
+ info->init();
+ return TRUE;
+}
- do {
- result = InterlockedCompareExchange(lock, ONCE_ININIT, ONCE_UNINITED);
- if (result == ONCE_UNINITED) {
- init();
- *lock = ONCE_DONE;
- return 1;
- }
- } while (result == ONCE_ININIT);
+int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void))
+{
+ INIT_ONCE *myonce = (INIT_ONCE *)once;
+ struct init_once_cb_info info = { init };
+ BOOL bstatus;
- return (*lock == ONCE_DONE);
+ bstatus = InitOnceExecuteOnce(myonce, init_wrapper, (void *)&info, NULL);
+ if (bstatus == TRUE)
+ return 1;
+ return 0;
}
int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *))
* 0x0603 // Windows 8.1
* 0x0A00 // Windows 10
*/
-#define _WIN32_WINNT 0x0501
+#define _WIN32_WINNT 0x0600
#endif
#include <windows.h>
#include <stdio.h>
typedef DWORD CRYPTO_THREAD_LOCAL;
typedef DWORD CRYPTO_THREAD_ID;
-typedef LONG CRYPTO_ONCE;
-#define CRYPTO_ONCE_STATIC_INIT 0
+typedef INIT_ONCE CRYPTO_ONCE;
+#define CRYPTO_ONCE_STATIC_INIT INIT_ONCE_STATIC_INIT
#endif
#else
#if defined(__TANDEM) && defined(_SPT_MODEL_)
#define OPENSSL_SYS_WIN32_CYGWIN
#else
#if defined(_WIN32) || defined(OPENSSL_SYS_WIN32)
+#include "windows.h"
#undef OPENSSL_SYS_UNIX
#if !defined(OPENSSL_SYS_WIN32)
#define OPENSSL_SYS_WIN32
buffer = ossl_rand_pool_add_begin(pool, bytes_needed);
if (buffer != NULL) {
size_t bytes = 0;
- if (BCryptGenRandom(NULL, buffer, bytes_needed,
+ if (BCryptGenRandom(NULL, buffer, (ULONG)bytes_needed,
BCRYPT_USE_SYSTEM_PREFERRED_RNG)
== STATUS_SUCCESS)
bytes = bytes_needed;
#if defined(OPENSSL_SYS_WINDOWS)
static CRYPTO_ONCE ensure_wsa_startup_once = CRYPTO_ONCE_STATIC_INIT;
-static CRYPTO_RWLOCK *wsa_lock;
-static int wsa_started;
-static int wsa_ref;
-
-static void ossl_wsa_cleanup(void)
-{
- if (wsa_started) {
- wsa_started = 0;
- WSACleanup();
- }
-
- CRYPTO_THREAD_lock_free(wsa_lock);
- wsa_lock = NULL;
-}
DEFINE_RUN_ONCE_STATIC(do_wsa_startup)
{
WORD versionreq = 0x0202; /* Version 2.2 */
WSADATA wsadata;
- wsa_lock = CRYPTO_THREAD_lock_new();
- if (wsa_lock == NULL)
+ if (WSAStartup(versionreq, &wsadata) != 0)
return 0;
- if (WSAStartup(versionreq, &wsadata) != 0) {
- CRYPTO_THREAD_lock_free(wsa_lock);
- wsa_lock = NULL;
- return 0;
- }
- wsa_started = 1;
-
return 1;
}
static ossl_inline int ensure_wsa_startup(void)
{
- int rv, unused;
-
- rv = RUN_ONCE(&ensure_wsa_startup_once, do_wsa_startup);
- if (rv != 0)
- CRYPTO_atomic_add(&wsa_ref, 1, &unused, wsa_lock);
-
- return rv;
-}
-
-static void wsa_done(void)
-{
- int ref;
-
- if (wsa_lock != NULL) {
- CRYPTO_atomic_add(&wsa_ref, -1, &ref, wsa_lock);
- if (ref == 0) {
- ossl_wsa_cleanup();
- ensure_wsa_startup_once = CRYPTO_ONCE_STATIC_INIT;
- wsa_lock = NULL;
- }
- }
+ return RUN_ONCE(&ensure_wsa_startup_once, do_wsa_startup);
}
#endif
if (!ensure_wsa_startup()) {
ERR_raise_data(ERR_LIB_SSL, ERR_R_INTERNAL_ERROR,
"Cannot start Windows sockets");
-
- wsa_done();
return 0;
}
#endif
BIO_closesocket(nfy->wfd);
BIO_closesocket(nfy->rfd);
nfy->rfd = nfy->wfd = -1;
-#if defined(OPENSSL_SYS_WINDOWS)
- wsa_done();
-#endif
}
int ossl_rio_notifier_signal(RIO_NOTIFIER *nfy)
AcquireSRWLockExclusive
AcquireSRWLockShared
+BCryptGenRandom
CertCloseStore
CertFindCertificateInStore
CertFreeCertificateContext