summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorKai Koehne <kai.koehne@digia.com>2014-10-28 16:56:05 +0100
committerKai Koehne <kai.koehne@theqtcompany.com>2014-11-11 13:34:32 +0100
commit8ce93376cd6aa1fac0eeacbd804bc211b0814c91 (patch)
treec603ecdd01edc4e7815cbb98d3305a9d89e1937f /src/network
parent18e4fd1dd1babe3b4178d8815594f4d3af87df19 (diff)
OS X and iOS: Search for openssl libs in .app/Contents/Frameworks
This allows apps to ship their own openssl libraries inside the application bundle. The change consists of two parts: First, adding <bundle>/Contents/Frameworks to the alternative search paths. Second, disabling the preemtive check for libssl.dylib, libcrypto.dylib in the system paths: The system's /usr/lib/libssl.dylib, /usr/lib/libcrypto.dylib will still be picked up as a fallback in the alternative search paths, but only after .app/Contents/Frameworks have been inspected. [ChangeLog][QtNetwork][QSsl] On OS X and iOS, openssl dylib's are picked up from the 'Frameworks' directory of the app bundle. Change-Id: I982930f4a6cf5e0114c04ecbc87f27e54ba8bb88 Reviewed-by: Jake Petroules <jake.petroules@petroules.com>
Diffstat (limited to 'src/network')
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp
index f4562cdb21..71b8237e03 100644
--- a/src/network/ssl/qsslsocket_openssl_symbols.cpp
+++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp
@@ -63,6 +63,9 @@
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
#include <link.h>
#endif
+#ifdef Q_OS_DARWIN
+#include "private/qcore_mac_p.h"
+#endif
#include <algorithm>
@@ -452,6 +455,15 @@ static QStringList libraryPathList()
# ifdef Q_OS_DARWIN
paths = QString::fromLatin1(qgetenv("DYLD_LIBRARY_PATH"))
.split(QLatin1Char(':'), QString::SkipEmptyParts);
+
+ // search in .app/Contents/Frameworks
+ UInt32 packageType;
+ CFBundleGetPackageInfo(CFBundleGetMainBundle(), &packageType, NULL);
+ if (packageType == FOUR_CHAR_CODE('APPL')) {
+ QUrl bundleUrl = QUrl::fromCFURL(QCFType<CFURLRef>(CFBundleCopyBundleURL(CFBundleGetMainBundle())));
+ QUrl frameworksUrl = QUrl::fromCFURL(QCFType<CFURLRef>(CFBundleCopyPrivateFrameworksURL(CFBundleGetMainBundle())));
+ paths << bundleUrl.resolved(frameworksUrl).path();
+ }
# else
paths = QString::fromLatin1(qgetenv("LD_LIBRARY_PATH"))
.split(QLatin1Char(':'), QString::SkipEmptyParts);
@@ -601,7 +613,13 @@ static QPair<QLibrary*, QLibrary*> loadOpenSsl()
}
#endif
+#ifndef Q_OS_DARWIN
// second attempt: find the development files libssl.so and libcrypto.so
+ //
+ // disabled on OS X/iOS:
+ // OS X's /usr/lib/libssl.dylib, /usr/lib/libcrypto.dylib will be picked up in the third
+ // attempt, _after_ <bundle>/Contents/Frameworks has been searched.
+ // iOS does not ship a system libssl.dylib, libcrypto.dylib in the first place.
libssl->setFileNameAndVersion(QLatin1String("ssl"), -1);
libcrypto->setFileNameAndVersion(QLatin1String("crypto"), -1);
if (libcrypto->load() && libssl->load()) {
@@ -611,6 +629,7 @@ static QPair<QLibrary*, QLibrary*> loadOpenSsl()
libssl->unload();
libcrypto->unload();
}
+#endif
// third attempt: loop on the most common library paths and find libssl
QStringList sslList = findAllLibSsl();