[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdeutils/ark
From:       Raphael Kubo da Costa <kubito () gmail ! com>
Date:       2009-12-29 4:57:20
Message-ID: 1262062640.121955.18320.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1067179 by rkcosta:

Do not call QDir::relativeFilePath() from QDir::current().

QDir::setCurrent() is called if global work dir is set, which ends
up resolving symlinks automatically. Creating a QDir and calling
relativeFilePath() on this object solves the problem.

BUG: 191821

 M  +12 -7     kerfuffle/cliinterface.cpp  
 M  +14 -9     plugins/libarchive/libarchivehandler.cpp  
 M  +2 -0      plugins/libarchive/libarchivehandler.h  


--- trunk/KDE/kdeutils/ark/kerfuffle/cliinterface.cpp #1067178:1067179
@@ -228,10 +228,11 @@
         return false;
     }
 
-    QString globalWorkdir = options.value("GlobalWorkDir").toString();
-    if (!globalWorkdir.isEmpty()) {
-        kDebug() << "GlobalWorkDir is set, changing dir to " << globalWorkdir;
-        QDir::setCurrent(globalWorkdir);
+    const QString globalWorkDir = options.value("GlobalWorkDir").toString();
+    const QDir workDir = globalWorkDir.isEmpty() ? QDir::current() : QDir(globalWorkDir);
+    if (!globalWorkDir.isEmpty()) {
+        kDebug() << "GlobalWorkDir is set, changing dir to " << globalWorkDir;
+        QDir::setCurrent(globalWorkDir);
     }
 
     //start preparing the argument list
@@ -239,7 +240,7 @@
 
     //now replace the various elements in the list
     for (int i = 0; i < args.size(); ++i) {
-        QString argument = args.at(i);
+        const QString argument = args.at(i);
         kDebug() << "Processing argument " << argument;
 
         if (argument == "$Archive") {
@@ -249,9 +250,13 @@
         if (argument == "$Files") {
             args.removeAt(i);
             for (int j = 0; j < files.count(); ++j) {
+                // #191821: workDir must be used instead of QDir::current()
+                //          so that symlinks aren't resolved automatically
+                // TODO: this kind of call should be moved upwards in the
+                //       class hierarchy to avoid code duplication
+                const QString relativeName =
+                    workDir.relativeFilePath(files.at(j));
 
-                QString relativeName = QDir::current().relativeFilePath(files.at(j));
-
                 args.insert(i + j, relativeName);
                 ++i;
             }
--- trunk/KDE/kdeutils/ark/plugins/libarchive/libarchivehandler.cpp #1067178:1067179
@@ -46,7 +46,8 @@
         : ReadWriteArchiveInterface(parent, args),
         m_cachedArchiveEntryCount(0),
         m_emitNoEntries(false),
-        m_extractedFilesSize(0)
+        m_extractedFilesSize(0),
+        m_workDir(QDir::current())
 {
 }
 
@@ -295,14 +296,13 @@
     int ret;
     const bool creatingNewFile = !QFileInfo(filename()).exists();
 
-    QString tempFilename = filename() + ".arkWriting";
+    const QString tempFilename = filename() + ".arkWriting";
 
-    kDebug() << "Current path " << QDir::currentPath();
-
-    QString globalWorkdir = options.value("GlobalWorkDir").toString();
-    if (!globalWorkdir.isEmpty()) {
-        kDebug() << "GlobalWorkDir is set, changing dir to " << globalWorkdir;
-        QDir::setCurrent(globalWorkdir);
+    const QString globalWorkDir = options.value("GlobalWorkDir").toString();
+    if (!globalWorkDir.isEmpty()) {
+        kDebug() << "GlobalWorkDir is set, changing dir to " << globalWorkDir;
+        m_workDir.setPath(globalWorkDir);
+        QDir::setCurrent(globalWorkDir);
     }
 
     m_writtenFiles.clear();
@@ -653,8 +653,13 @@
     int header_response;
 
     const bool trailingSlash = fileName.endsWith('/');
-    QString relativeName = QDir::current().relativeFilePath(fileName) + (trailingSlash ? "/" : "");
 
+    // #191821: workDir must be used instead of QDir::current()
+    //          so that symlinks aren't resolved automatically
+    // TODO: this kind of call should be moved upwards in the
+    //       class hierarchy to avoid code duplication
+    const QString relativeName = m_workDir.relativeFilePath(fileName) + (trailingSlash ? "/" : "");
+
     KDE_stat(QFile::encodeName(relativeName).constData(), &st);
     archive_entry_copy_stat(entry, &st);
     archive_entry_copy_pathname(entry, QFile::encodeName(relativeName).constData());
--- trunk/KDE/kdeutils/ark/plugins/libarchive/libarchivehandler.h #1067178:1067179
@@ -28,6 +28,7 @@
 #define LIBARCHIVEHANDLER_H
 
 #include "kerfuffle/archiveinterface.h"
+#include <QDir>
 #include <QList>
 #include <QStringList>
 
@@ -57,6 +58,7 @@
     qlonglong m_currentExtractedFilesSize;
     bool m_emitNoEntries;
     qlonglong m_extractedFilesSize;
+    QDir m_workDir;
     QStringList m_writtenFiles;
 };
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic