From abd795a1877a4d8b79513b43048430870453f34c Mon Sep 17 00:00:00 2001
From: unknown <svoj@mysql.com>
Date: Thu, 16 Jun 2005 16:35:09 +0500
Subject: [PATCH] WL#2286 - Compile MySQL w/YASSL support Merge with latest
 yaSSL.

extra/yassl/include/lock.hpp:
  Merge with latest yaSSL.
extra/yassl/include/socket_wrapper.hpp:
  Merge with latest yaSSL.
extra/yassl/mySTL/helpers.hpp:
  Merge with latest yaSSL.
extra/yassl/src/lock.cpp:
  Merge with latest yaSSL.
extra/yassl/src/log.cpp:
  Merge with latest yaSSL.
extra/yassl/src/socket_wrapper.cpp:
  Merge with latest yaSSL.
extra/yassl/src/ssl.cpp:
  Merge with latest yaSSL.
extra/yassl/src/timer.cpp:
  Merge with latest yaSSL.
extra/yassl/taocrypt/include/misc.hpp:
  Merge with latest yaSSL.
extra/yassl/taocrypt/include/random.hpp:
  Merge with latest yaSSL.
extra/yassl/taocrypt/include/types.hpp:
  Merge with latest yaSSL.
extra/yassl/taocrypt/src/asn.cpp:
  Merge with latest yaSSL.
extra/yassl/taocrypt/src/integer.cpp:
  Merge with latest yaSSL.
extra/yassl/taocrypt/src/misc.cpp:
  Merge with latest yaSSL.
extra/yassl/taocrypt/src/random.cpp:
  Merge with latest yaSSL.
---
 extra/yassl/include/lock.hpp            |  6 ++--
 extra/yassl/include/socket_wrapper.hpp  |  4 +--
 extra/yassl/mySTL/helpers.hpp           | 23 +++++++++-----
 extra/yassl/src/lock.cpp                |  6 ++--
 extra/yassl/src/log.cpp                 |  4 +--
 extra/yassl/src/socket_wrapper.cpp      | 16 +++++-----
 extra/yassl/src/ssl.cpp                 |  2 +-
 extra/yassl/src/timer.cpp               |  6 ++--
 extra/yassl/taocrypt/include/misc.hpp   | 11 ++-----
 extra/yassl/taocrypt/include/random.hpp |  2 +-
 extra/yassl/taocrypt/include/types.hpp  | 16 +++++-----
 extra/yassl/taocrypt/src/asn.cpp        |  1 -
 extra/yassl/taocrypt/src/integer.cpp    | 40 +++++++++++++++++++++----
 extra/yassl/taocrypt/src/misc.cpp       | 16 ----------
 extra/yassl/taocrypt/src/random.cpp     | 10 +++----
 15 files changed, 86 insertions(+), 77 deletions(-)

diff --git a/extra/yassl/include/lock.hpp b/extra/yassl/include/lock.hpp
index 11a623879d4..f5231528821 100644
--- a/extra/yassl/include/lock.hpp
+++ b/extra/yassl/include/lock.hpp
@@ -31,7 +31,7 @@ namespace yaSSL {
 
 
 #ifdef MULTI_THREADED
-    #ifdef WIN32
+    #ifdef _WIN32
         #include <windows.h>
 
         class Mutex {
@@ -50,7 +50,7 @@ namespace yaSSL {
                 ~Lock();
             };
         };
-    #else  // WIN32
+    #else  // _WIN32
         #include <pthread.h>
 
         class Mutex {
@@ -71,7 +71,7 @@ namespace yaSSL {
             };
         };
 
-    #endif // WIN32
+    #endif // _WIN32
 #else  // MULTI_THREADED (WE'RE SINGLE)
 
     class Mutex {
diff --git a/extra/yassl/include/socket_wrapper.hpp b/extra/yassl/include/socket_wrapper.hpp
index a103cca1b37..38a9ce3bd25 100644
--- a/extra/yassl/include/socket_wrapper.hpp
+++ b/extra/yassl/include/socket_wrapper.hpp
@@ -31,7 +31,7 @@
 
 #include <assert.h>
 
-#ifdef WIN32
+#ifdef _WIN32
     #include <winsock2.h>
 #else 
     #include <sys/time.h>
@@ -47,7 +47,7 @@ namespace yaSSL {
 
 typedef unsigned int uint;
 
-#ifdef WIN32
+#ifdef _WIN32
     typedef SOCKET socket_t;
 #else
     typedef int socket_t;
diff --git a/extra/yassl/mySTL/helpers.hpp b/extra/yassl/mySTL/helpers.hpp
index 5f9b4beaa40..8d2061fc4f1 100644
--- a/extra/yassl/mySTL/helpers.hpp
+++ b/extra/yassl/mySTL/helpers.hpp
@@ -31,32 +31,39 @@
 #include <new>        // placement new
 
 
+
 #ifdef __IBMCPP__
 /*
-  Workaround for the lack of operator new(size_t, void*)
-  in IBM VA C++ 6.0
+      Workaround for the lack of operator new(size_t, void*)
+      in IBM VA C++ 6.0
 */
-struct Dummy {};
-inline void *operator new(size_t size, Dummy *d) { return (void*) d; }
-typedef Dummy *yassl_pointer;
+    struct Dummy {};
+
+    inline void* operator new(size_t size, Dummy* d) 
+    { 
+        return static_cast<void*>(d);
+    }
+
+    typedef Dummy* yassl_pointer;
 #else
-typedef void *yassl_pointer;
+    typedef void*  yassl_pointer;
 #endif
 
+
 namespace mySTL {
 
 
 template <typename T, typename T2>
 inline void construct(T* p, const T2& value)
 {
-    new ((yassl_pointer) p) T(value);
+    new (reinterpret_cast<yassl_pointer>(p)) T(value);
 }
 
 
 template <typename T>
 inline void construct(T* p)
 {
-    new (static_cast<void*>(p)) T();
+    new (reinterpret_cast<yassl_pointer>(p)) T();
 }
 
 
diff --git a/extra/yassl/src/lock.cpp b/extra/yassl/src/lock.cpp
index b8f6212ad3f..8a0b66ead42 100644
--- a/extra/yassl/src/lock.cpp
+++ b/extra/yassl/src/lock.cpp
@@ -29,7 +29,7 @@ namespace yaSSL {
 
 
 #ifdef MULTI_THREADED
-    #ifdef WIN32
+    #ifdef _WIN32
         
         Mutex::Mutex()
         {
@@ -54,7 +54,7 @@ namespace yaSSL {
             LeaveCriticalSection(&mutex_.cs_); 
         }
             
-    #else  // WIN32
+    #else  // _WIN32
         
         Mutex::Mutex()
         {
@@ -80,7 +80,7 @@ namespace yaSSL {
         }
          
 
-    #endif // WIN32
+    #endif // _WIN32
 #endif // MULTI_THREADED
 
 
diff --git a/extra/yassl/src/log.cpp b/extra/yassl/src/log.cpp
index 538b80b8280..38633cd1210 100644
--- a/extra/yassl/src/log.cpp
+++ b/extra/yassl/src/log.cpp
@@ -78,8 +78,8 @@ namespace yaSSL {
     }
 
 
-    #if defined(WIN32) || defined(__MACH__) || defined(__hpux__)
-    typedef int socklen_t;
+    #if defined(_WIN32) || defined(__MACH__) || defined(__hpux__)
+        typedef int socklen_t;
     #endif
 
 
diff --git a/extra/yassl/src/socket_wrapper.cpp b/extra/yassl/src/socket_wrapper.cpp
index 1be6a715980..00f9c8d170c 100644
--- a/extra/yassl/src/socket_wrapper.cpp
+++ b/extra/yassl/src/socket_wrapper.cpp
@@ -28,7 +28,7 @@
 
 #include "socket_wrapper.hpp"
 
-#ifndef WIN32
+#ifndef _WIN32
     #include <errno.h>
     #include <netdb.h>
     #include <unistd.h>
@@ -36,19 +36,19 @@
     #include <netinet/in.h>
     #include <sys/ioctl.h>
     #include <string.h>
-#endif // WIN32
+#endif // _WIN32
 
 #ifdef __sun
     #include <sys/filio.h>
 #endif
 
-#ifdef WIN32
+#ifdef _WIN32
     const int SOCKET_EINVAL = WSAEINVAL;
     const int SOCKET_EWOULDBLOCK = WSAEWOULDBLOCK;
 #else
     const int SOCKET_EINVAL = EINVAL;
     const int SOCKET_EWOULDBLOCK = EWOULDBLOCK;
-#endif // WIN32
+#endif // _WIN32
 
 
 namespace yaSSL {
@@ -80,7 +80,7 @@ Socket::~Socket()
 void Socket::closeSocket()
 {
     if (socket_ != INVALID_SOCKET) {
-#ifdef WIN32
+#ifdef _WIN32
         closesocket(socket_);
 #else
         close(socket_);
@@ -94,7 +94,7 @@ uint Socket::get_ready() const
 {
     unsigned long ready = 0;
 
-#ifdef WIN32
+#ifdef _WIN32
     ioctlsocket(socket_, FIONREAD, &ready);
 #else
     ioctl(socket_, FIONREAD, &ready);
@@ -145,7 +145,7 @@ void Socket::shutDown(int how)
 
 int Socket::get_lastError()
 {
-#ifdef WIN32
+#ifdef _WIN32
     return WSAGetLastError();
 #else
     return errno;
@@ -155,7 +155,7 @@ int Socket::get_lastError()
 
 void Socket::set_lastError(int errorCode)
 {
-#ifdef WIN32
+#ifdef _WIN32
     WSASetLastError(errorCode);
 #else
     errno = errorCode;
diff --git a/extra/yassl/src/ssl.cpp b/extra/yassl/src/ssl.cpp
index a82afcd4aad..d37c44049b2 100644
--- a/extra/yassl/src/ssl.cpp
+++ b/extra/yassl/src/ssl.cpp
@@ -32,11 +32,11 @@
 
 /*  see man pages for function descriptions */
 
+#include "runtime.hpp"
 #include "openssl/ssl.h"
 #include "handshake.hpp"
 #include "yassl_int.hpp"
 #include <stdio.h>
-#include "runtime.hpp"
 
 
 namespace yaSSL {
diff --git a/extra/yassl/src/timer.cpp b/extra/yassl/src/timer.cpp
index 547c31205c6..cfa1319ae80 100644
--- a/extra/yassl/src/timer.cpp
+++ b/extra/yassl/src/timer.cpp
@@ -27,7 +27,7 @@
 
 namespace yaSSL {
 
-#ifdef WIN32
+#ifdef _WIN32
 
     #define WIN32_LEAN_AND_MEAN
     #include <windows.h>
@@ -54,7 +54,7 @@ namespace yaSSL {
         return static_cast<uint>(timer());
     }
 
-#else // WIN32
+#else // _WIN32
 
     #include <sys/time.h>
 
@@ -77,5 +77,5 @@ namespace yaSSL {
     }
 
 
-#endif // WIN32
+#endif // _WIN32
 } // namespace yaSSL
diff --git a/extra/yassl/taocrypt/include/misc.hpp b/extra/yassl/taocrypt/include/misc.hpp
index 812cdd93879..187d5cc6769 100644
--- a/extra/yassl/taocrypt/include/misc.hpp
+++ b/extra/yassl/taocrypt/include/misc.hpp
@@ -30,14 +30,9 @@
 #include "types.hpp"
 #include "type_traits.hpp"
 
-/*
-namespace GCC_ABI {
-    extern "C" int __cxa_pure_virtual();
-} */
 
-namespace TaoCrypt {
 
-// using GCC_ABI::__cxa_pure_virtual;
+namespace TaoCrypt {
 
 // library allocation
 struct new_t {};      // TaoCrypt New type
@@ -75,7 +70,7 @@ void tcArrayDelete(T* ptr)
 
 
 // to resolve compiler generated operator delete on base classes with
-// virtual destructors, make sure doesn't get called
+// virtual destructors (when on stack), make sure doesn't get called
 class virtual_base {
 public:
     static void operator delete(void*) { assert(0); }
@@ -742,8 +737,6 @@ unsigned int  BytePrecision(unsigned long value);
 unsigned int  BitPrecision(unsigned long);
 unsigned long Crop(unsigned long value, unsigned int size);
 
-void CallNewHandler();
-
 
 
 } // namespace
diff --git a/extra/yassl/taocrypt/include/random.hpp b/extra/yassl/taocrypt/include/random.hpp
index 5fdda8da47a..62f49a8716f 100644
--- a/extra/yassl/taocrypt/include/random.hpp
+++ b/extra/yassl/taocrypt/include/random.hpp
@@ -42,7 +42,7 @@ public:
     void   GenerateSeed(byte*, word32 sz);
     Error  GetError() const { return error_; }
 private:
-#if defined(WIN32)
+#if defined(_WIN32)
     #if defined(_WIN64)
         typedef unsigned __int64 ProviderHandle;
         // type HCRYPTPROV, avoid #include <windows.h>
diff --git a/extra/yassl/taocrypt/include/types.hpp b/extra/yassl/taocrypt/include/types.hpp
index 9c5d3e4b194..d497d45e1da 100644
--- a/extra/yassl/taocrypt/include/types.hpp
+++ b/extra/yassl/taocrypt/include/types.hpp
@@ -80,16 +80,14 @@ typedef unsigned int   word32;
 #else
     #define TAOCRYPT_NATIVE_DWORD_AVAILABLE
     #ifdef WORD64_AVAILABLE
-            #define TAOCRYPT_SLOW_WORD64 
-            // define this if your CPU is not64-bit to use alternative code
-            // that avoids word64
-            typedef word16 hword;
-            typedef word32 word;
-            typedef word64 dword;
+        #define TAOCRYPT_SLOW_WORD64 
+        typedef word16 hword;
+        typedef word32 word;
+        typedef word64 dword;
     #else
-            typedef byte   hword;
-            typedef word16 word;
-            typedef word32 dword;
+        typedef byte   hword;
+        typedef word16 word;
+        typedef word32 dword;
     #endif
 #endif
 
diff --git a/extra/yassl/taocrypt/src/asn.cpp b/extra/yassl/taocrypt/src/asn.cpp
index 720fe7cd532..8f8d2ba52da 100644
--- a/extra/yassl/taocrypt/src/asn.cpp
+++ b/extra/yassl/taocrypt/src/asn.cpp
@@ -22,7 +22,6 @@
 /* asn.cpp implements ASN1 BER, PublicKey, and x509v3 decoding 
 */
 
-
 #include "runtime.hpp"
 #include "asn.hpp"
 #include "file.hpp"
diff --git a/extra/yassl/taocrypt/src/integer.cpp b/extra/yassl/taocrypt/src/integer.cpp
index 0f06b9805dd..ebfefb027b3 100644
--- a/extra/yassl/taocrypt/src/integer.cpp
+++ b/extra/yassl/taocrypt/src/integer.cpp
@@ -23,6 +23,7 @@
 
 /* based on Wei Dai's integer.cpp from CryptoPP */
 
+#include "runtime.hpp"
 #include "integer.hpp"
 #include "modarith.hpp"
 #include "asn.hpp"
@@ -34,6 +35,21 @@
 #endif
 
 
+#if defined(_MSC_VER) && defined(_WIN64)  // 64 bit X overflow intrinsic
+    #ifdef __ia64__
+        #define myUMULH __UMULH
+    #elif  __x86_64__
+        #define myUMULH __umulh
+    #else
+        #error unknown 64bit windows
+    #endif
+
+extern "C" word myUMULH(word, word); 
+
+#pragma intrinsic (myUMULH)
+#endif
+
+
 #ifdef SSE2_INTRINSICS_AVAILABLE
     #ifdef __GNUC__
         #include <xmmintrin.h>
@@ -73,16 +89,15 @@ CPP_TYPENAME AllocatorBase<T>::pointer AlignedAllocator<T>::allocate(
     {
         void* p;
     #ifdef TAOCRYPT_MM_MALLOC_AVAILABLE
-        while (!(p = _mm_malloc(sizeof(T)*n, 16)))
+        p = _mm_malloc(sizeof(T)*n, 16);
     #elif defined(TAOCRYPT_MEMALIGN_AVAILABLE)
-        while (!(p = memalign(16, sizeof(T)*n)))
+        p = memalign(16, sizeof(T)*n);
     #elif defined(TAOCRYPT_MALLOC_ALIGNMENT_IS_16)
-        while (!(p = malloc(sizeof(T)*n)))
+        p = malloc(sizeof(T)*n);
     #else
-        while (!(p = (byte *)malloc(sizeof(T)*n + 8)))
+        p = (byte *)malloc(sizeof(T)*n + 8);
         // assume malloc alignment is at least 8
     #endif
-        CallNewHandler();
 
     #ifdef TAOCRYPT_NO_ALIGNED_ALLOC
         assert(m_pBlock == 0);
@@ -156,8 +171,14 @@ DWord() {}
     static DWord Multiply(word a, word b)
     {
         DWord r;
+
         #ifdef TAOCRYPT_NATIVE_DWORD_AVAILABLE
             r.whole_ = (dword)a * b;
+
+        #elif defined(_MSC_VER)
+            r.halfs_.low = a*b;
+            r.halfs_.high = myUMULH(a,b);
+
         #elif defined(__alpha__)
             r.halfs_.low = a*b;
             #ifdef __GNUC__
@@ -166,22 +187,27 @@ DWord() {}
             #elif defined(__DECCXX)
                 r.halfs_.high = asm("umulh %a0, %a1, %v0", a, b);
             #else
-                #error can not implement multiply overflow
+                #error unknown alpha compiler
             #endif
+
         #elif defined(__ia64__)
             r.halfs_.low = a*b;
             __asm__("xmpy.hu %0=%1,%2" : "=f" (r.halfs_.high)
                 : "f" (a), "f" (b));
+
         #elif defined(_ARCH_PPC64)
             r.halfs_.low = a*b;
             __asm__("mulhdu %0,%1,%2" : "=r" (r.halfs_.high)
                 : "r" (a), "r" (b) : "cc");
+
         #elif defined(__x86_64__)
             __asm__("mulq %3" : "=d" (r.halfs_.high), "=a" (r.halfs_.low) :
                 "a" (a), "rm" (b) : "cc");
+
         #elif defined(__mips64)
             __asm__("dmultu %2,%3" : "=h" (r.halfs_.high), "=l" (r.halfs_.low)
                 : "r" (a), "r" (b));
+
         #elif defined(_M_IX86)
             // for testing
             word64 t = (word64)a * b;
@@ -190,6 +216,7 @@ DWord() {}
         #else
             #error can not implement DWord
         #endif
+
         return r;
     }
 
@@ -3936,5 +3963,6 @@ template hword DivideThreeWordsByTwo<hword, Word>(hword*, hword, hword, Word*);
 template word DivideThreeWordsByTwo<word, DWord>(word*, word, word, DWord*);
 #endif
 
+
 } // namespace
 
diff --git a/extra/yassl/taocrypt/src/misc.cpp b/extra/yassl/taocrypt/src/misc.cpp
index 3ec4502ed57..6a801a9995a 100644
--- a/extra/yassl/taocrypt/src/misc.cpp
+++ b/extra/yassl/taocrypt/src/misc.cpp
@@ -64,10 +64,6 @@ void* operator new[](size_t sz);
 void operator delete[](void* ptr);
 */
 
-/* namespace GCC_ABI {
-    extern "C" int __cxa_pure_virtual() { assert(0); return 0; }
-} */
-
 
 namespace TaoCrypt {
 
@@ -135,17 +131,5 @@ unsigned long Crop(unsigned long value, unsigned int size)
 }
 
 
-#if !(defined(_MSC_VER) && (_MSC_VER < 1300)) && \
-    !(defined(__HP_aCC) && (__HP_aCC <= 36300))
-using std::new_handler;
-using std::set_new_handler;
-#endif
-
-void CallNewHandler()
-{
-    abort();
-}
-
-
 }  // namespace
 
diff --git a/extra/yassl/taocrypt/src/random.cpp b/extra/yassl/taocrypt/src/random.cpp
index 921e710540d..69fb180720a 100644
--- a/extra/yassl/taocrypt/src/random.cpp
+++ b/extra/yassl/taocrypt/src/random.cpp
@@ -26,7 +26,7 @@
 
 #include "random.hpp"
 
-#if defined(WIN32)
+#if defined(_WIN32)
     #define _WIN32_WINNT 0x0400
     #include <windows.h>
     #include <wincrypt.h>
@@ -34,7 +34,7 @@
     #include <errno.h>
     #include <fcntl.h>
     #include <unistd.h>
-#endif // WIN32
+#endif // _WIN32
 
 namespace TaoCrypt {
 
@@ -64,7 +64,7 @@ byte RandomNumberGenerator::GenerateByte()
 }
 
 
-#if defined(WIN32)
+#if defined(_WIN32)
 
 OS_Seed::OS_Seed()
 {
@@ -87,7 +87,7 @@ void OS_Seed::GenerateSeed(byte* output, word32 sz)
 }
 
 
-#else // WIN32
+#else // _WIN32
 
 
 OS_Seed::OS_Seed() 
@@ -122,7 +122,7 @@ void OS_Seed::GenerateSeed(byte* output, word32 sz)
     }
 }
 
-#endif // WIN32
+#endif // _WIN32
 
 
 
-- 
2.30.9