diff options
-rw-r--r-- | src/network/ssl/qsslsocket_openssl_symbols.cpp | 63 |
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 |