summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorNiels Weber <niels.2.weber@nokia.com>2012-04-20 12:31:34 (GMT)
committerQt by Nokia <qt-info@nokia.com>2012-04-25 23:30:42 (GMT)
commit206747069fac8f5b8850f22ed2f56b8298379b9e (patch)
treea5506d184f6c9c048fb4199948675b9245338de3 /src/network
parent35aff3e7adf6235dd69bcb8cbc5a03947aded863 (diff)
downloadQt-206747069fac8f5b8850f22ed2f56b8298379b9e.zip
Qt-206747069fac8f5b8850f22ed2f56b8298379b9e.tar.gz
Qt-206747069fac8f5b8850f22ed2f56b8298379b9e.tar.bz2
Improved detection of libcrypto and libssl.
The previous solution didn't work on systems where the libraries aren't in the same location. Now we search for both libcrypto and libssl and load them if their versions match, even if they are in different directories. Task-number: QTBUG-25398 Change-Id: I37164638890586947d07670d8a59fc53a84f9c42 (cherry-picked from commit 8643e1992f6c62983345f89d793742b3449a69ea) Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
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