summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/fileutils.cpp
diff options
context:
space:
mode:
authorTim Jenssen <tim.jenssen@digia.com>2013-12-10 19:25:57 +0100
committerTim Jenssen <tim.jenssen@digia.com>2013-12-10 19:28:06 +0100
commita1af06f34abe5743ba9bf9ea244ca014e2e40e54 (patch)
tree4f48c551487f6b0f771096da10ba4d2c525dde15 /src/libs/installer/fileutils.cpp
parent31173b011820f13969ea884ef80c2ac17c6c4231 (diff)
fix generation of random temp directory name
Task-number: QTIFW-427 Change-Id: Id398f810e8bf4488919297581298307ed3251d28 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Diffstat (limited to 'src/libs/installer/fileutils.cpp')
-rw-r--r--src/libs/installer/fileutils.cpp55
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;
}