Skip to content
Snippets Groups Projects
Commit 3753dbd5 authored by Nat Goodspeed's avatar Nat Goodspeed
Browse files

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().
parent cbbe655f
No related branches found
No related tags found
No related merge requests found
......@@ -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
}
......
......@@ -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)
}
}
}
......@@ -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
}
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment