]> granicus.if.org Git - transmission/commitdiff
TRAC-6098: Rework trailing slash stripping (once more)
authorMike Gelfand <mikedld@mikedld.com>
Mon, 3 Oct 2016 19:22:25 +0000 (22:22 +0300)
committerMike Gelfand <mikedld@mikedld.com>
Mon, 3 Oct 2016 19:22:25 +0000 (22:22 +0300)
Using QFileInfo to strip trailing slash(es) is bad when input contains non-
native paths (i.e. Windows paths on non-Windows system and vice versa) as it
may mistakenly treat the path as relative and change it in unespected way.

qt/Utils.cc

index b4607e211df4bba35c09774ae3697ba4f26a8ed8..6f1cd437f5b85b2b29fada335c728bb806d3d4d3 100644 (file)
@@ -45,9 +45,9 @@
 extern QPixmap qt_pixmapFromWinHICON(HICON icon);
 #endif
 
-#ifdef _WIN32
 namespace
 {
+#ifdef _WIN32
   void
   addAssociatedFileIcon (const QFileInfo& fileInfo, UINT iconSize, QIcon& icon)
   {
@@ -83,9 +83,15 @@ namespace
     if (!pixmap.isNull ())
       icon.addPixmap (pixmap);
   }
-} // namespace
 #endif
 
+  bool
+  isSlashChar (const QChar& c)
+  {
+    return c == QLatin1Char ('/') || c == QLatin1Char ('\\');
+  }
+} // namespace
+
 QIcon
 Utils::guessMimeIcon (const QString& filename)
 {
@@ -201,8 +207,10 @@ Utils::isValidUtf8 (const char * s)
 QString
 Utils::removeTrailingDirSeparator (const QString& path)
 {
-  const QFileInfo pathInfo (path);
-  return pathInfo.fileName ().isEmpty () ? pathInfo.absolutePath () : pathInfo.absoluteFilePath ();
+  int i = path.size ();
+  while (i > 1 && isSlashChar (path[i - 1]))
+    --i;
+  return path.left (i);
 }
 
 int