|
2 | 2 |
|
3 | 3 | #ifdef HTTPS_BACKEND_OPENSSL
|
4 | 4 |
|
5 |
| -#include <dlfcn.h> |
| 5 | +#include "../common/LibraryLoader.h" |
6 | 6 |
|
7 | 7 | // Not present in openssl 1.1 headers
|
8 | 8 | #define SSL_CTRL_OPTIONS 32
|
9 | 9 |
|
10 |
| -template <class T> |
11 |
| -static inline bool loadSymbol(T &var, void *handle, const char *name) |
12 |
| -{ |
13 |
| - var = reinterpret_cast<T>(dlsym(handle, name)); |
14 |
| - return var != nullptr; |
15 |
| -} |
16 |
| - |
17 | 10 | OpenSSLConnection::SSLFuncs::SSLFuncs()
|
18 | 11 | {
|
| 12 | + using namespace LibraryLoader; |
| 13 | + |
19 | 14 | valid = false;
|
20 | 15 |
|
21 | 16 | // Try OpenSSL 1.1
|
22 |
| - void *sslhandle = dlopen("libssl.so.1.1", RTLD_LAZY); |
23 |
| - void *cryptohandle = dlopen("libcrypto.so.1.1", RTLD_LAZY); |
| 17 | + handle *sslhandle = OpenLibrary("libssl.so.1.1"); |
| 18 | + handle *cryptohandle = OpenLibrary("libcrypto.so.1.1"); |
24 | 19 | // Try OpenSSL 1.0
|
25 | 20 | if (!sslhandle || !cryptohandle)
|
26 | 21 | {
|
27 |
| - sslhandle = dlopen("libssl.so.1.0.0", RTLD_LAZY); |
28 |
| - cryptohandle = dlopen("libcrypto.so.1.0.0", RTLD_LAZY); |
| 22 | + sslhandle = OpenLibrary("libssl.so.1.0.0"); |
| 23 | + cryptohandle = OpenLibrary("libcrypto.so.1.0.0"); |
29 | 24 | }
|
30 | 25 | // Try OpenSSL without version
|
31 | 26 | if (!sslhandle || !cryptohandle)
|
32 | 27 | {
|
33 |
| - sslhandle = dlopen("libssl.so", RTLD_LAZY); |
34 |
| - cryptohandle = dlopen("libcrypto.so", RTLD_LAZY); |
| 28 | + sslhandle = OpenLibrary("libssl.so"); |
| 29 | + cryptohandle = OpenLibrary("libcrypto.so"); |
35 | 30 | }
|
36 | 31 | // Give up
|
37 | 32 | if (!sslhandle || !cryptohandle)
|
38 | 33 | return;
|
39 | 34 |
|
40 | 35 | valid = true;
|
41 |
| - valid = valid && (loadSymbol(library_init, sslhandle, "SSL_library_init") || |
42 |
| - loadSymbol(init_ssl, sslhandle, "OPENSSL_init_ssl")); |
43 |
| - |
44 |
| - valid = valid && loadSymbol(CTX_new, sslhandle, "SSL_CTX_new"); |
45 |
| - valid = valid && loadSymbol(CTX_ctrl, sslhandle, "SSL_CTX_ctrl"); |
46 |
| - valid = valid && loadSymbol(CTX_set_verify, sslhandle, "SSL_CTX_set_verify"); |
47 |
| - valid = valid && loadSymbol(CTX_set_default_verify_paths, sslhandle, "SSL_CTX_set_default_verify_paths"); |
48 |
| - valid = valid && loadSymbol(CTX_free, sslhandle, "SSL_CTX_free"); |
49 |
| - |
50 |
| - valid = valid && loadSymbol(SSL_new, sslhandle, "SSL_new"); |
51 |
| - valid = valid && loadSymbol(SSL_free, sslhandle, "SSL_free"); |
52 |
| - valid = valid && loadSymbol(set_fd, sslhandle, "SSL_set_fd"); |
53 |
| - valid = valid && loadSymbol(connect, sslhandle, "SSL_connect"); |
54 |
| - valid = valid && loadSymbol(read, sslhandle, "SSL_read"); |
55 |
| - valid = valid && loadSymbol(write, sslhandle, "SSL_write"); |
56 |
| - valid = valid && loadSymbol(shutdown, sslhandle, "SSL_shutdown"); |
57 |
| - valid = valid && loadSymbol(get_verify_result, sslhandle, "SSL_get_verify_result"); |
58 |
| - valid = valid && loadSymbol(get_peer_certificate, sslhandle, "SSL_get_peer_certificate"); |
59 |
| - |
60 |
| - valid = valid && (loadSymbol(SSLv23_method, sslhandle, "SSLv23_method") || |
61 |
| - loadSymbol(SSLv23_method, sslhandle, "TLS_method")); |
62 |
| - |
63 |
| - valid = valid && loadSymbol(check_host, cryptohandle, "X509_check_host"); |
| 36 | + valid = valid && (LoadSymbol(library_init, sslhandle, "SSL_library_init") || |
| 37 | + LoadSymbol(init_ssl, sslhandle, "OPENSSL_init_ssl")); |
| 38 | + |
| 39 | + valid = valid && LoadSymbol(CTX_new, sslhandle, "SSL_CTX_new"); |
| 40 | + valid = valid && LoadSymbol(CTX_ctrl, sslhandle, "SSL_CTX_ctrl"); |
| 41 | + valid = valid && LoadSymbol(CTX_set_verify, sslhandle, "SSL_CTX_set_verify"); |
| 42 | + valid = valid && LoadSymbol(CTX_set_default_verify_paths, sslhandle, "SSL_CTX_set_default_verify_paths"); |
| 43 | + valid = valid && LoadSymbol(CTX_free, sslhandle, "SSL_CTX_free"); |
| 44 | + |
| 45 | + valid = valid && LoadSymbol(SSL_new, sslhandle, "SSL_new"); |
| 46 | + valid = valid && LoadSymbol(SSL_free, sslhandle, "SSL_free"); |
| 47 | + valid = valid && LoadSymbol(set_fd, sslhandle, "SSL_set_fd"); |
| 48 | + valid = valid && LoadSymbol(connect, sslhandle, "SSL_connect"); |
| 49 | + valid = valid && LoadSymbol(read, sslhandle, "SSL_read"); |
| 50 | + valid = valid && LoadSymbol(write, sslhandle, "SSL_write"); |
| 51 | + valid = valid && LoadSymbol(shutdown, sslhandle, "SSL_shutdown"); |
| 52 | + valid = valid && LoadSymbol(get_verify_result, sslhandle, "SSL_get_verify_result"); |
| 53 | + valid = valid && LoadSymbol(get_peer_certificate, sslhandle, "SSL_get_peer_certificate"); |
| 54 | + |
| 55 | + valid = valid && (LoadSymbol(SSLv23_method, sslhandle, "SSLv23_method") || |
| 56 | + LoadSymbol(SSLv23_method, sslhandle, "TLS_method")); |
| 57 | + |
| 58 | + valid = valid && LoadSymbol(check_host, cryptohandle, "X509_check_host"); |
64 | 59 |
|
65 | 60 | if (library_init)
|
66 | 61 | library_init();
|
|
0 commit comments