forked from qt-creator/qt-creator
Utils: Fix endless loop when ls iterating subdirs
findUsingLs did try to enter "." and "..", with especially "." leading to an endless loop. findUsingLs also did not correctly concatenate the parent folder for sub directories. Change-Id: Ieafad4d4ef38d2fb550ddef1d2edf8183ce8032e Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -1256,7 +1256,8 @@ bool UnixDeviceFileAccess::iterateWithFind(const FilePath &filePath,
|
|||||||
|
|
||||||
void UnixDeviceFileAccess::findUsingLs(const QString ¤t,
|
void UnixDeviceFileAccess::findUsingLs(const QString ¤t,
|
||||||
const FileFilter &filter,
|
const FileFilter &filter,
|
||||||
QStringList *found) const
|
QStringList *found,
|
||||||
|
const QString &start) const
|
||||||
{
|
{
|
||||||
const RunResult result = runInShell(
|
const RunResult result = runInShell(
|
||||||
{"ls", {"-1", "-a", "-p", "--", current}, OsType::OsTypeLinux});
|
{"ls", {"-1", "-a", "-p", "--", current}, OsType::OsTypeLinux});
|
||||||
@@ -1265,10 +1266,11 @@ void UnixDeviceFileAccess::findUsingLs(const QString ¤t,
|
|||||||
const QChar last = entry.back();
|
const QChar last = entry.back();
|
||||||
if (last == '/') {
|
if (last == '/') {
|
||||||
entry.chop(1);
|
entry.chop(1);
|
||||||
if (filter.iteratorFlags.testFlag(QDirIterator::Subdirectories))
|
if (filter.iteratorFlags.testFlag(QDirIterator::Subdirectories) && entry != "."
|
||||||
findUsingLs(current + '/' + entry, filter, found);
|
&& entry != "..")
|
||||||
|
findUsingLs(current + '/' + entry, filter, found, start + entry + "/");
|
||||||
}
|
}
|
||||||
found->append(entry);
|
found->append(start + entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1327,7 +1329,7 @@ void UnixDeviceFileAccess::iterateDirectory(const FilePath &filePath,
|
|||||||
|
|
||||||
// if we do not have find - use ls as fallback
|
// if we do not have find - use ls as fallback
|
||||||
QStringList entries;
|
QStringList entries;
|
||||||
findUsingLs(filePath.path(), filter, &entries);
|
findUsingLs(filePath.path(), filter, &entries, {});
|
||||||
iterateLsOutput(filePath, entries, filter, callBack);
|
iterateLsOutput(filePath, entries, filter, callBack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -183,16 +183,15 @@ protected:
|
|||||||
|
|
||||||
expected_str<FilePath> createTempFile(const FilePath &filePath) override;
|
expected_str<FilePath> createTempFile(const FilePath &filePath) override;
|
||||||
|
|
||||||
|
void findUsingLs(const QString ¤t,
|
||||||
|
const FileFilter &filter,
|
||||||
|
QStringList *found,
|
||||||
|
const QString &start) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool iterateWithFind(
|
bool iterateWithFind(const FilePath &filePath,
|
||||||
const FilePath &filePath,
|
const FileFilter &filter,
|
||||||
const FileFilter &filter,
|
const FilePath::IterateDirCallback &callBack) const;
|
||||||
const FilePath::IterateDirCallback &callBack) const;
|
|
||||||
void findUsingLs(
|
|
||||||
const QString ¤t,
|
|
||||||
const FileFilter &filter,
|
|
||||||
QStringList *found) const;
|
|
||||||
|
|
||||||
QStringList statArgs(const FilePath &filePath,
|
QStringList statArgs(const FilePath &filePath,
|
||||||
const QString &linuxFormat,
|
const QString &linuxFormat,
|
||||||
|
@@ -48,6 +48,11 @@ public:
|
|||||||
p.waitForFinished();
|
p.waitForFinished();
|
||||||
return {p.exitCode(), p.readAllStandardOutput(), p.readAllStandardError()};
|
return {p.exitCode(), p.readAllStandardOutput(), p.readAllStandardError()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void findUsingLs(const QString ¤t, const FileFilter &filter, QStringList *found)
|
||||||
|
{
|
||||||
|
UnixDeviceFileAccess::findUsingLs(current, filter, found, {});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class tst_unixdevicefileaccess : public QObject
|
class tst_unixdevicefileaccess : public QObject
|
||||||
@@ -69,6 +74,27 @@ private slots:
|
|||||||
QCOMPARE(size, 1024);
|
QCOMPARE(size, 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void findUsingLs()
|
||||||
|
{
|
||||||
|
QStringList result;
|
||||||
|
m_dfa.findUsingLs(m_tempDir.path(),
|
||||||
|
{{}, QDir::NoFilter, QDirIterator::Subdirectories},
|
||||||
|
&result);
|
||||||
|
|
||||||
|
QCOMPARE(result, QStringList({".", "..", "size-test"}));
|
||||||
|
|
||||||
|
QDir tDir(m_tempDir.path());
|
||||||
|
tDir.mkdir("lsfindsubdir");
|
||||||
|
|
||||||
|
result.clear();
|
||||||
|
m_dfa.findUsingLs(m_tempDir.path(),
|
||||||
|
{{}, QDir::NoFilter, QDirIterator::Subdirectories},
|
||||||
|
&result);
|
||||||
|
QCOMPARE(result,
|
||||||
|
QStringList(
|
||||||
|
{".", "..", "lsfindsubdir/.", "lsfindsubdir/..", "lsfindsubdir", "size-test"}));
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TestDFA m_dfa;
|
TestDFA m_dfa;
|
||||||
DeviceFileAccess *m_dfaPtr = &m_dfa;
|
DeviceFileAccess *m_dfaPtr = &m_dfa;
|
||||||
|
Reference in New Issue
Block a user