]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Remember all iterated directories to prevent an endless recursion by links. Tested...
authorPeter Penz <peter.penz19@gmail.com>
Sun, 16 Jan 2011 19:51:48 +0000 (19:51 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Sun, 16 Jan 2011 19:51:48 +0000 (19:51 +0000)
svn path=/trunk/KDE/kdebase/apps/; revision=1214895

src/search/filenamesearchprotocol.cpp
src/search/filenamesearchprotocol.h

index 8464205ff34b251ee065bb273a76df9094acd0c3..4670888aa46da6958261fefb17cd764d2a292da5 100644 (file)
 FileNameSearchProtocol::FileNameSearchProtocol( const QByteArray &pool, const QByteArray &app ) :
     SlaveBase("search", pool, app),
     m_checkContent(false),
-    m_regExp(0)
+    m_regExp(0),
+    m_iteratedDirs()
 {
 }
 
 FileNameSearchProtocol::~FileNameSearchProtocol()
 {
-    delete m_regExp;
-    m_regExp = 0;
+    cleanup();
 }
 
 void FileNameSearchProtocol::listDir(const KUrl& url)
 {
-    delete m_regExp;
-    m_regExp = 0;
+    cleanup();
 
     const QString search = url.queryItem("search");
     if (!search.isEmpty()) {
@@ -63,11 +62,17 @@ void FileNameSearchProtocol::listDir(const KUrl& url)
     const QString urlString = url.queryItem("url");
     searchDirectory(KUrl(urlString));
 
+    cleanup();
     finished();
 }
 
 void FileNameSearchProtocol::searchDirectory(const KUrl& directory)
 {
+    if (directory.path() == QLatin1String("/proc")) {
+        // Don't try to iterate the /proc directory of Linux
+        return;
+    }
+
     // Get all items of the directory
     KDirLister *dirLister = new KDirLister();
     dirLister->setDelayedMimeTypes(false);
@@ -97,22 +102,22 @@ void FileNameSearchProtocol::searchDirectory(const KUrl& directory)
         }
 
         if (item.isDir()) {
-            bool skipDir = false;
-            const KUrl itemDir = item.url();
             if (item.isLink()) {
-                // Assure that no endless searching is done if a link points
-                // to a parent directory
-                const KUrl linkDestDir = item.linkDest();
-                skipDir = linkDestDir.isParentOf(itemDir);
-            }
-
-            if (!skipDir) {
-                pendingDirs.append(itemDir);
+                // Assure that no endless searching is done in directories that
+                // have already been iterated.
+                const KUrl linkDest(item.url(), item.linkDest());
+                if (!m_iteratedDirs.contains(linkDest.path())) {
+                    pendingDirs.append(linkDest);
+                }
+            } else {
+                pendingDirs.append(item.url());
             }
         }
     }
     listEntry(KIO::UDSEntry(), true);
 
+    m_iteratedDirs.insert(directory.path());
+
     delete dirLister;
     dirLister = 0;
 
@@ -162,6 +167,13 @@ bool FileNameSearchProtocol::contentContainsPattern(const KUrl& fileName) const
      return false;
 }
 
+void FileNameSearchProtocol::cleanup()
+{
+    delete m_regExp;
+    m_regExp = 0;
+    m_iteratedDirs.clear();
+}
+
 extern "C" int KDE_EXPORT kdemain( int argc, char **argv )
 {
     KComponentData instance("kio_search");
index b2d64d6e390617144e930069a6f1ccb8cb085e5c..4a854d7294e61a928d6a556f0e4b159d39f14381 100644 (file)
@@ -50,9 +50,11 @@ private:
      */
     bool contentContainsPattern(const KUrl& fileName) const;
 
+    void cleanup();
 
     bool m_checkContent;
     QRegExp* m_regExp;
+    QSet<QString> m_iteratedDirs;
 };
 
 #endif