[openssl-commits] [openssl] master update

Matt Caswell matt at openssl.org
Fri May 20 22:19:06 UTC 2016


The branch master has been updated
       via  fcb318c64b8c3ff24ec36f99797880386bed5867 (commit)
      from  739a1eb1961cdc3b1597a040766f3cb359d095f6 (commit)


- Log -----------------------------------------------------------------
commit fcb318c64b8c3ff24ec36f99797880386bed5867
Author: Matt Caswell <matt at openssl.org>
Date:   Thu May 19 20:11:09 2016 +0100

    Fix Windows 64 bit crashes
    
    The function InitOnceExceuteOnce is the best way to support the
    implementation of CRYPTO_THREAD_run_once() on Windows. Unfortunately
    WinXP doesn't have it. To get around that we had two different
    implementations: one for WinXP and one for later versions. Which one was
    used was based on the value of _WIN32_WINNT.
    
    This approach was starting to cause problems though because other parts of
    OpenSSL assume _WIN32_WINNT is going to be 0x0501 and crashes were
    occurring dependant on include file ordering. In addition a conditional
    based on _WIN32_WINNT had made its way into a public header file through
    commit 5c4328f. This is problematic because the value of this macro can
    vary between OpenSSL build time and application build time.
    
    The simplest solution to this mess is just to always use the WinXP version
    of CRYPTO_THREAD_run_once(). Its perhaps slightly sub-optimal but probably
    not noticably.
    
    GitHub Issue #1086
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>

-----------------------------------------------------------------------

Summary of changes:
 crypto/threads_win.c     | 27 ++++-----------------------
 include/openssl/crypto.h |  7 +------
 2 files changed, 5 insertions(+), 29 deletions(-)

diff --git a/crypto/threads_win.c b/crypto/threads_win.c
index ff4aae4..545b9be 100644
--- a/crypto/threads_win.c
+++ b/crypto/threads_win.c
@@ -55,12 +55,14 @@ void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock)
     return;
 }
 
-# if _WIN32_WINNT < 0x0600
-
 #  define ONCE_UNINITED     0
 #  define ONCE_ININIT       1
 #  define ONCE_DONE         2
 
+/*
+ * 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))
 {
     LONG volatile *lock = (LONG *)once;
@@ -81,27 +83,6 @@ int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void))
     return (*lock == ONCE_DONE);
 }
 
-# else
-
-BOOL CALLBACK once_cb(PINIT_ONCE once, PVOID p, PVOID *pp)
-{
-    void (*init)(void) = p;
-
-    init();
-
-    return TRUE;
-}
-
-int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void))
-{
-    if (InitOnceExecuteOnce(once, once_cb, init, NULL))
-        return 1;
-
-    return 0;
-}
-
-# endif
-
 int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *))
 {
     *key = TlsAlloc();
diff --git a/include/openssl/crypto.h b/include/openssl/crypto.h
index 1162c71..84c479c 100644
--- a/include/openssl/crypto.h
+++ b/include/openssl/crypto.h
@@ -396,13 +396,8 @@ typedef unsigned int CRYPTO_THREAD_ID;
 typedef DWORD CRYPTO_THREAD_LOCAL;
 typedef DWORD CRYPTO_THREAD_ID;
 
-#  if _WIN32_WINNT < 0x0600
 typedef LONG CRYPTO_ONCE;
-#   define CRYPTO_ONCE_STATIC_INIT 0
-#  else
-typedef INIT_ONCE CRYPTO_ONCE;
-#   define CRYPTO_ONCE_STATIC_INIT INIT_ONCE_STATIC_INIT
-#  endif
+#  define CRYPTO_ONCE_STATIC_INIT 0
 
 # else
 #  include <pthread.h>


More information about the openssl-commits mailing list