diff options
author | Tim Jenssen <tim.jenssen@digia.com> | 2013-12-10 19:25:57 +0100 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@digia.com> | 2013-12-10 19:28:06 +0100 |
commit | a1af06f34abe5743ba9bf9ea244ca014e2e40e54 (patch) | |
tree | 4f48c551487f6b0f771096da10ba4d2c525dde15 | |
parent | 31173b011820f13969ea884ef80c2ac17c6c4231 (diff) |
fix generation of random temp directory name
Task-number: QTIFW-427
Change-Id: Id398f810e8bf4488919297581298307ed3251d28
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
-rw-r--r-- | src/libs/installer/fileutils.cpp | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp index c7c7436bb..e499fd100 100644 --- a/src/libs/installer/fileutils.cpp +++ b/src/libs/installer/fileutils.cpp @@ -460,20 +460,63 @@ QString QInstaller::generateTemporaryFileName(const QString &templ) return f.fileName(); } +static char *installer_mkdtemp(char *templateName) +{ + QDir newDir; +#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) + static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + + const size_t length = strlen(templateName); + + char *XXXXXX = templateName + length - 6; + + if ((length < 6u) || strncmp(XXXXXX, "XXXXXX", 6)) + return 0; + + for (int i = 0; i < 256; ++i) { + /* Fill in the random bits. */ + int v = qrand(); + XXXXXX[0] = letters[v % 62]; + v /= 62; + XXXXXX[1] = letters[v % 62]; + v = qrand(); + XXXXXX[2] = letters[v % 62]; + v /= 62; + XXXXXX[3] = letters[v % 62]; + v = qrand(); + XXXXXX[4] = letters[v % 62]; + v /= 62; + XXXXXX[5] = letters[v % 62]; + + QString templateNameStr = QFile::decodeName(templateName); + + newDir = QDir(templateNameStr); + if (newDir.mkpath(templateNameStr)) + return templateName; + } + return 0; +#else + return mkdtemp(templateName); +#endif +} + QString QInstaller::createTemporaryDirectory(const QString &templateName) { + // TODO: use QTemporaryDir if we switched to Qt5 QString path = QDir::tempPath() + QLatin1String("/") + templateName + QLatin1String("XXXXXX"); - { + path = QFile::decodeName(installer_mkdtemp(QFile::encodeName(path).data())); + if (path.isEmpty()) { QTemporaryFile f(path); if (!f.open()) { - throw Error(QObject::tr("Could not create temporary directory %1: %2").arg(f.fileName(), - f.errorString())); + throw Error(QObject::tr("Could not create temporary directory at %1: %2" + ).arg(QFileInfo(f).absolutePath(), f.errorString())); + } else { + throw Error(QObject::tr("Could not create temporary directory at %1: unknown error" + ).arg(QFileInfo(f).absolutePath())); } - path = f.fileName(); } - qDebug() << "\nCreating temporary directory at:" << path; - QInstaller::mkpath(path); + qDebug() << "Temporary directory created:" << path; return path; } |