Skip to content

Commit

Permalink
Fix QUrl::fromLocalFile with long path prefix
Browse files Browse the repository at this point in the history
After commit 3966b57 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 <[email protected]>
  • Loading branch information
kaheimri committed May 19, 2021
1 parent f111c37 commit 06689a2
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
22 changes: 20 additions & 2 deletions src/corelib/io/qurl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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('/')) {
Expand Down
4 changes: 4 additions & 0 deletions tests/auto/corelib/io/qurl/tst_qurl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1333,6 +1333,10 @@ void tst_QUrl::fromLocalFile_data()
<< QString(QString("//somehost") + suffix).replace('/', '\\')
<< QString("file://somehost") + suffix
<< QString(suffix);
QTest::addRow("windows-backslash-extlen-%s", pathDescription)
<< QString(QString("//?") + suffix).replace('/', '\\')
<< QString("file:////%3F") + suffix
<< QString("//?") + suffix;
#endif
QTest::addRow("windows-extlen-%s", pathDescription)
<< QString("//?") + suffix
Expand Down

0 comments on commit 06689a2

Please sign in to comment.