diff --git a/autotests/urlutiltest.cpp b/autotests/urlutiltest.cpp --- a/autotests/urlutiltest.cpp +++ b/autotests/urlutiltest.cpp @@ -37,11 +37,21 @@ QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/test/data/documents/muh"), lUrl("/home/test")), lUrl("/home/test/data")); QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/test/data/documents/muh/"), lUrl("/home/test")), lUrl("/home/test/data")); QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/test/data/documents/muh"), lUrl("/home/test/")), lUrl("/home/test/data")); + QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/a/"), lUrl("/home")), lUrl("/home/a")); + QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/te"), lUrl("/")), lUrl("/te")); + // One letter under root is also a valid child + QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/d"), lUrl("/")), lUrl("/d")); + // Same urls sould return QUrl() QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/test/data"), lUrl("/home/test/data/")), QUrl()); QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/test/data/"), lUrl("/home/test/data")), QUrl()); QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/test/"), lUrl("/home/test/")), QUrl()); + QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/"), lUrl("/")), QUrl()); + // Not related urls should return QUrl() QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/aaa/"), lUrl("/home/bbb/")), QUrl()); QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/aaa/"), lUrl("/home/bbb/ccc")), QUrl()); + QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home"), lUrl("/test")), QUrl()); + // Child urls in reverse order should return QUrl() + QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home"), lUrl("/home/test")), QUrl()); // # is %23 in an URL, so this test could reveal path/URL confusion in the code: QCOMPARE(KIO::UrlUtil::firstChildUrl(lUrl("/home/a#/b#"), lUrl("/home/a#")), lUrl("/home/a#/b#")); } diff --git a/src/filewidgets/urlutil_p.h b/src/filewidgets/urlutil_p.h --- a/src/filewidgets/urlutil_p.h +++ b/src/filewidgets/urlutil_p.h @@ -66,13 +66,21 @@ const QString childPath = adjustedLastUrl.path(); const QString parentPath = adjustedCurrentUrl.path(); + // if the parent path is root "/" + // one char more is a valid path, otherwise "/" and another char are needed. + const int minIndex = (parentPath == QLatin1String("/")) ? 1 : 2; // e.g. this would just be ok: + // childPath = /a len=2 + // parentPath = / len=1 // childPath = /home/a len=7 // parentPath = /home len=5 - Q_ASSERT(childPath.length() >= (parentPath.length() + 2)); - const int idx2 = childPath.indexOf(QLatin1Char('/'), parentPath.length() + 2); + if (childPath.length() < (parentPath.length() + minIndex) ) { + return QUrl(); + } + + const int idx2 = childPath.indexOf(QLatin1Char('/'), parentPath.length() + minIndex); // parentPath = /home // childPath = /home/a // idx = -1