From 127cab437b53096b18beb0cfe299137dc384060d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Mon, 9 Aug 2010 17:50:58 +0200 Subject: Make prefix handling in file engine creation more robust ... and make it exit earlier, when feasible. While we could fully validate the prefix at this level, consulting Unicode tables on each character of a file name could quickly become expensive. Furthermore, we can already reap some benefits just by checking for '/' before ':'. Reviewed-by: Marius Storm-Olsen --- src/corelib/io/qabstractfileengine.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/corelib/io/qabstractfileengine.cpp b/src/corelib/io/qabstractfileengine.cpp index 80bc244..6646e4e 100644 --- a/src/corelib/io/qabstractfileengine.cpp +++ b/src/corelib/io/qabstractfileengine.cpp @@ -182,11 +182,18 @@ QAbstractFileEngine *QAbstractFileEngine::create(const QString &fileName) } #ifdef QT_BUILD_CORE_LIB - if (!fileName.startsWith(QLatin1Char('/'))) { - int prefixSeparator = fileName.indexOf(QLatin1Char(':')); - if (prefixSeparator == 0) { - return new QResourceFileEngine(fileName); - } else if (prefixSeparator > 1) { + for (int prefixSeparator = 0; prefixSeparator < fileName.size(); ++prefixSeparator) { + QChar const ch = fileName[prefixSeparator]; + if (ch == QLatin1Char('/')) + break; + + if (ch == QLatin1Char(':')) { + if (prefixSeparator == 0) + return new QResourceFileEngine(fileName); + + if (prefixSeparator == 1) + break; + const QStringList &paths = QDir::searchPaths(fileName.left(prefixSeparator)); for (int i = 0; i < paths.count(); i++) { QAbstractFileEngine *engine = create(paths.at(i) % QLatin1Char('/') % fileName.mid(prefixSeparator + 1)); @@ -195,7 +202,16 @@ QAbstractFileEngine *QAbstractFileEngine::create(const QString &fileName) } delete engine; } + + break; } + + // There's no need to fully validate the prefix here. Consulting the + // unicode tables could be expensive and validation is already + // performed in QDir::setSearchPaths. + // + // if (!ch.isLetterOrNumber()) + // break; } #endif -- cgit v0.12