summaryrefslogtreecommitdiffstats
path: root/src/corelib/io
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2021-05-18 23:14:25 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2021-05-19 21:38:38 +0200
commit06689a2d7a18882535819ed13ac7248c81330529 (patch)
treec99dfe7dec2233ae33caee550704ce65532fb11e /src/corelib/io
parentf111c376d6535ef8c60a34ddd4682fcfa0f4e2bb (diff)
Fix QUrl::fromLocalFile with long path prefix
After commit 3966b571 the function was kinda broken already, though this got unnoticed since it was not covered by an the auto-test. This commit adds another test case with Windows native separators and removes the use of QDir::fromNativeSeparators. Instead use the original code from QDir::fromNativeSeparators to replace the backslashes. Pick-to: 5.15 6.0 6.1 Change-Id: I190560d0e75cb8c177d63b142aa4be5b01498da2 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/corelib/io')
-rw-r--r--src/corelib/io/qurl.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index c303cfb13e..1e198ebdd3 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -413,7 +413,6 @@
#include "qstringlist.h"
#include "qdebug.h"
#include "qhash.h"
-#include "qdir.h" // for QDir::fromNativeSeparators
#include "qdatastream.h"
#include "private/qipaddress_p.h"
#include "qurlquery.h"
@@ -3291,6 +3290,25 @@ bool QUrl::isDetached() const
return !d || d->ref.loadRelaxed() == 1;
}
+static QString fromNativeSeparators(const QString &pathName)
+{
+#if defined(Q_OS_WIN)
+ QString result(pathName);
+ const QChar nativeSeparator = u'\\';
+ auto i = result.indexOf(nativeSeparator);
+ if (i != -1) {
+ QChar * const data = result.data();
+ const auto length = result.length();
+ for (; i < length; ++i) {
+ if (data[i] == nativeSeparator)
+ data[i] = u'/';
+ }
+ }
+ return result;
+#else
+ return pathName;
+#endif
+}
/*!
Returns a QUrl representation of \a localFile, interpreted as a local
@@ -3329,7 +3347,7 @@ QUrl QUrl::fromLocalFile(const QString &localFile)
if (localFile.isEmpty())
return url;
QString scheme = fileScheme();
- QString deslashified = QDir::fromNativeSeparators(localFile);
+ QString deslashified = fromNativeSeparators(localFile);
// magic for drives on windows
if (deslashified.length() > 1 && deslashified.at(1) == QLatin1Char(':') && deslashified.at(0) != QLatin1Char('/')) {