|
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