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:
Marcus Tillmanns
2023-11-07 12:25:29 +01:00
parent 845676f814
commit 437797d1c4
3 changed files with 40 additions and 13 deletions

View File

@@ -1256,7 +1256,8 @@ bool UnixDeviceFileAccess::iterateWithFind(const FilePath &filePath,
void UnixDeviceFileAccess::findUsingLs(const QString &current,
const FileFilter &filter,
QStringList *found) const
QStringList *found,
const QString &start) const
{
const RunResult result = runInShell(
{"ls", {"-1", "-a", "-p", "--", current}, OsType::OsTypeLinux});
@@ -1265,10 +1266,11 @@ void UnixDeviceFileAccess::findUsingLs(const QString &current,
const QChar last = entry.back();
if (last == '/') {
entry.chop(1);
if (filter.iteratorFlags.testFlag(QDirIterator::Subdirectories))
findUsingLs(current + '/' + entry, filter, found);
if (filter.iteratorFlags.testFlag(QDirIterator::Subdirectories) && entry != "."
&& 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
QStringList entries;
findUsingLs(filePath.path(), filter, &entries);
findUsingLs(filePath.path(), filter, &entries, {});
iterateLsOutput(filePath, entries, filter, callBack);
}

View File

@@ -183,16 +183,15 @@ protected:
expected_str<FilePath> createTempFile(const FilePath &filePath) override;
void findUsingLs(const QString &current,
const FileFilter &filter,
QStringList *found,
const QString &start) const;
private:
bool iterateWithFind(
const FilePath &filePath,
bool iterateWithFind(const FilePath &filePath,
const FileFilter &filter,
const FilePath::IterateDirCallback &callBack) const;
void findUsingLs(
const QString &current,
const FileFilter &filter,
QStringList *found) const;
QStringList statArgs(const FilePath &filePath,
const QString &linuxFormat,

View File

@@ -48,6 +48,11 @@ public:
p.waitForFinished();
return {p.exitCode(), p.readAllStandardOutput(), p.readAllStandardError()};
}
void findUsingLs(const QString &current, const FileFilter &filter, QStringList *found)
{
UnixDeviceFileAccess::findUsingLs(current, filter, found, {});
}
};
class tst_unixdevicefileaccess : public QObject
@@ -69,6 +74,27 @@ private slots:
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:
TestDFA m_dfa;
DeviceFileAccess *m_dfaPtr = &m_dfa;