summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'src/network')
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols.cpp63
1 files changed, 51 insertions, 12 deletions
diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp
index b6fbb01..75d47ed 100644
--- a/src/network/ssl/qsslsocket_openssl_symbols.cpp
+++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp
@@ -356,7 +356,7 @@ static int dlIterateCallback(struct dl_phdr_info *info, size_t size, void *data)
}
#endif
-static QStringList findAllLibSsl()
+static QStringList libraryPathList()
{
QStringList paths;
# ifdef Q_OS_DARWIN
@@ -367,6 +367,9 @@ static QStringList findAllLibSsl()
.split(QLatin1Char(':'), QString::SkipEmptyParts);
# endif
paths << QLatin1String("/lib") << QLatin1String("/usr/lib") << QLatin1String("/usr/local/lib");
+ paths << QLatin1String("/lib64") << QLatin1String("/usr/lib64") << QLatin1String("/usr/local/lib64");
+ paths << QLatin1String("/lib32") << QLatin1String("/usr/lib32") << QLatin1String("/usr/local/lib32");
+
#ifdef Q_OS_LINUX
// discover paths of already loaded libraries
QSet<QString> loadedPaths;
@@ -374,9 +377,17 @@ static QStringList findAllLibSsl()
paths.append(loadedPaths.toList());
#endif
+ return paths;
+}
+
+
+static QStringList findAllLibSsl()
+{
+ QStringList paths = libraryPathList();
QStringList foundSsls;
+
foreach (const QString &path, paths) {
- QDir dir = QDir(path);
+ QDir dir(path);
QStringList entryList = dir.entryList(QStringList() << QLatin1String("libssl.*"), QDir::Files);
qSort(entryList.begin(), entryList.end(), libGreaterThan);
@@ -386,6 +397,23 @@ static QStringList findAllLibSsl()
return foundSsls;
}
+
+static QStringList findAllLibCrypto()
+{
+ QStringList paths = libraryPathList();
+
+ QStringList foundCryptos;
+ foreach (const QString &path, paths) {
+ QDir dir(path);
+ QStringList entryList = dir.entryList(QStringList() << QLatin1String("libcrypto.*"), QDir::Files);
+
+ qSort(entryList.begin(), entryList.end(), libGreaterThan);
+ foreach (const QString &entry, entryList)
+ foundCryptos << path + QLatin1Char('/') + entry;
+ }
+
+ return foundCryptos;
+}
# endif
#ifdef Q_OS_WIN
@@ -496,18 +524,29 @@ static QPair<QLibrary*, QLibrary*> loadOpenSsl()
// third attempt: loop on the most common library paths and find libssl
QStringList sslList = findAllLibSsl();
- foreach (const QString &ssl, sslList) {
- QString crypto = ssl;
- crypto.replace(QLatin1String("ssl"), QLatin1String("crypto"));
- libssl->setFileNameAndVersion(ssl, -1);
+ QStringList cryptoList = findAllLibCrypto();
+
+ foreach (const QString &crypto, cryptoList) {
libcrypto->setFileNameAndVersion(crypto, -1);
- if (libcrypto->load() && libssl->load()) {
- // libssl.so.0 and libcrypto.so.0 found
- return pair;
- } else {
- libssl->unload();
- libcrypto->unload();
+ if (libcrypto->load()) {
+ QFileInfo fi(crypto);
+ QString version = fi.completeSuffix();
+
+ foreach (const QString &ssl, sslList) {
+ if (!ssl.endsWith(version))
+ continue;
+
+ libssl->setFileNameAndVersion(ssl, -1);
+
+ if (libssl->load()) {
+ // libssl.so.x and libcrypto.so.x found
+ return pair;
+ } else {
+ libssl->unload();
+ }
+ }
}
+ libcrypto->unload();
}
// failed to load anything