From 3753dbd5edd3251c12e394cf313015d3120f070c Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Thu, 25 Oct 2018 10:58:12 -0400
Subject: [PATCH] DRTVWR-476: Use OpenSSL API suitable for 64-bit pointers.

In three different places we use the same pattern: an ssl_thread_id_callback()
function (a static member of LLCrashLogger, in that case) that used to be
passed to CRYPTO_set_id_callback() and therefore returned an unsigned long
representing the ID of the current thread.

But GetCurrentThread() is a HANDLE, an alias for a pointer, and you can't
uniquely cram a 64-bit pointer into an unsigned long.

Fortunately OpenSSL has a more modern API for retrieving thread ID. Pass
each ssl_thread_id_callback() function to CRYPTO_THREADID_set_callback()
instead, converting it to accept CRYPTO_THREADID* and call
CRYPTO_THREADID_set_pointer() or CRYPTO_THREADID_set_numeric() as appropriate().
---
 indra/llcorehttp/examples/http_texture_load.cpp | 10 +++++-----
 indra/llcorehttp/tests/llcorehttp_test.cpp      | 12 +++++-------
 indra/llcrashlogger/llcrashlogger.cpp           |  8 ++++----
 indra/llcrashlogger/llcrashlogger.h             |  7 ++++++-
 4 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/indra/llcorehttp/examples/http_texture_load.cpp b/indra/llcorehttp/examples/http_texture_load.cpp
index b91aaf0593a..f80e64c9651 100644
--- a/indra/llcorehttp/examples/http_texture_load.cpp
+++ b/indra/llcorehttp/examples/http_texture_load.cpp
@@ -52,7 +52,7 @@
 
 void init_curl();
 void term_curl();
-unsigned long ssl_thread_id_callback(void);
+void ssl_thread_id_callback(CRYPTO_THREADID*);
 void ssl_locking_callback(int mode, int type, const char * file, int line);
 void usage(std::ostream & out);
 
@@ -624,7 +624,7 @@ void init_curl()
 		}
 
 		CRYPTO_set_locking_callback(ssl_locking_callback);
-		CRYPTO_set_id_callback(ssl_thread_id_callback);
+		CRYPTO_THREADID_set_callback(ssl_thread_id_callback);
 	}
 }
 
@@ -640,12 +640,12 @@ void term_curl()
 }
 
 
-unsigned long ssl_thread_id_callback(void)
+void ssl_thread_id_callback(CRYPTO_THREADID* pthreadid)
 {
 #if defined(WIN32)
-	return (unsigned long) GetCurrentThread();
+	CRYPTO_THREADID_set_pointer(pthreadid, GetCurrentThread());
 #else
-	return (unsigned long) pthread_self();
+	CRYPTO_THREADID_set_numeric(pthreadid, pthread_self());
 #endif
 }
 
diff --git a/indra/llcorehttp/tests/llcorehttp_test.cpp b/indra/llcorehttp/tests/llcorehttp_test.cpp
index a310fc0508e..d2df15ed5fd 100755
--- a/indra/llcorehttp/tests/llcorehttp_test.cpp
+++ b/indra/llcorehttp/tests/llcorehttp_test.cpp
@@ -48,7 +48,7 @@
 #include "llproxy.h"
 #include "llcleanup.h"
 
-unsigned long ssl_thread_id_callback(void);
+void ssl_thread_id_callback(CRYPTO_THREADID*);
 void ssl_locking_callback(int mode, int type, const char * file, int line);
 
 #if 0	// lltut provides main and runner
@@ -93,7 +93,7 @@ void init_curl()
 		}
 
 		CRYPTO_set_locking_callback(ssl_locking_callback);
-		CRYPTO_set_id_callback(ssl_thread_id_callback);
+		CRYPTO_THREADID_set_callback(ssl_thread_id_callback);
 	}
 
 	LLProxy::getInstance();
@@ -113,12 +113,12 @@ void term_curl()
 }
 
 
-unsigned long ssl_thread_id_callback(void)
+void ssl_thread_id_callback(CRYPTO_THREADID* pthreadid)
 {
 #if defined(WIN32)
-	return (unsigned long) GetCurrentThread();
+	CRYPTO_THREADID_set_pointer(pthreadid, GetCurrentThread());
 #else
-	return (unsigned long) pthread_self();
+	CRYPTO_THREADID_set_numeric(pthreadid, pthread_self());
 #endif
 }
 
@@ -172,5 +172,3 @@ void stop_thread(LLCore::HttpRequest * req)
 		}
 	}
 }
-
-	
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 5e747155006..be7a08ac41c 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -642,7 +642,7 @@ void LLCrashLogger::init_curl()
         }
 
         CRYPTO_set_locking_callback(ssl_locking_callback);
-        CRYPTO_set_id_callback(ssl_thread_id_callback);
+        CRYPTO_THREADID_set_callback(ssl_thread_id_callback);
     }
 }
 
@@ -658,12 +658,12 @@ void LLCrashLogger::term_curl()
 }
 
 
-unsigned long LLCrashLogger::ssl_thread_id_callback(void)
+void LLCrashLogger::ssl_thread_id_callback(CRYPTO_THREADID* pthreadid)
 {
 #if LL_WINDOWS
-    return (unsigned long)GetCurrentThread();
+    CRYPTO_THREADID_set_pointer(pthreadid, GetCurrentThread());
 #else
-    return (unsigned long)pthread_self();
+    CRYPTO_THREADID_set_numeric(pthreadid, pthread_self());
 #endif
 }
 
diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h
index 56e26c23ba3..e3e8110a476 100644
--- a/indra/llcrashlogger/llcrashlogger.h
+++ b/indra/llcrashlogger/llcrashlogger.h
@@ -36,6 +36,11 @@
 #include "llcrashlock.h"
 #include "_mutex.h"
 
+// We shouldn't have to know the exact declaration of CRYPTO_THREADID, but VS
+// 2017 complains if we forward-declare it as simply 'struct CRYPTO_THREADID'.
+struct crypto_threadid_st;
+typedef crypto_threadid_st CRYPTO_THREADID;
+
 // Crash reporter behavior
 const S32 CRASH_BEHAVIOR_ASK = 0;
 const S32 CRASH_BEHAVIOR_ALWAYS_SEND = 1;
@@ -68,7 +73,7 @@ class LLCrashLogger : public LLApp
 protected:
     static void init_curl();
     static void term_curl();
-    static unsigned long ssl_thread_id_callback(void);
+    static void ssl_thread_id_callback(CRYPTO_THREADID*);
     static void ssl_locking_callback(int mode, int type, const char * file, int line);
 
 	S32 mCrashBehavior;
-- 
GitLab