summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qtemporarydir.cpp
diff options
context:
space:
mode:
authorKai Koehne <kai.koehne@digia.com>2013-12-11 13:14:18 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-12 13:57:01 +0100
commit70c70aef7ee35009bb00614fdd6d4d282f9c4e57 (patch)
treece5bfc4a13a045b40ae64f85c4fea07b123c262f /src/corelib/io/qtemporarydir.cpp
parent4d8a12904a49d6724098610f7e39b11821377b3a (diff)
Make QTemporaryDir file name more random
qrand() returns a number between 0 and RAND_MAX, which is only guaranteed to be bigger than 32767. Dividing it repeatedly means that the last bytes are always 0. [ChangeLog][QtCore][QTemporaryDir] Fixed bug in QTemporaryDir name generator that dramatically reduced randomness of the name. Change-Id: I90613a652e6384296aed827e2714fe63cd8797ee Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com> Reviewed-by: Tim Jenssen <tim.jenssen@digia.com>
Diffstat (limited to 'src/corelib/io/qtemporarydir.cpp')
-rw-r--r--src/corelib/io/qtemporarydir.cpp39
1 files changed, 25 insertions, 14 deletions
diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp
index 483a76fa82..2c526847b4 100644
--- a/src/corelib/io/qtemporarydir.cpp
+++ b/src/corelib/io/qtemporarydir.cpp
@@ -94,9 +94,19 @@ static QString defaultTemplateName()
return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String("-XXXXXX");
}
+#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
+
+static int nextRand(int &v)
+{
+ int r = v % 62;
+ v /= 62;
+ if (v < 62)
+ v = qrand();
+ return r;
+}
+
static char *q_mkdtemp(char *templateName)
{
-#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const size_t length = strlen(templateName);
@@ -110,16 +120,11 @@ static char *q_mkdtemp(char *templateName)
int v = qrand();
/* Fill in the random bits. */
- XXXXXX[0] = letters[v % 62];
- v /= 62;
- XXXXXX[1] = letters[v % 62];
- v /= 62;
- XXXXXX[2] = letters[v % 62];
- v /= 62;
- XXXXXX[3] = letters[v % 62];
- v /= 62;
- XXXXXX[4] = letters[v % 62];
- v /= 62;
+ XXXXXX[0] = letters[nextRand(v)];
+ XXXXXX[1] = letters[nextRand(v)];
+ XXXXXX[2] = letters[nextRand(v)];
+ XXXXXX[3] = letters[nextRand(v)];
+ XXXXXX[4] = letters[nextRand(v)];
XXXXXX[5] = letters[v % 62];
QString templateNameStr = QFile::decodeName(templateName);
@@ -137,11 +142,17 @@ static char *q_mkdtemp(char *templateName)
}
}
return 0;
-#else
- return mkdtemp(templateName);
-#endif
}
+#else // defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
+
+static char *q_mkdtemp(char *templateName)
+{
+ return mkdtemp(templateName);
+}
+
+#endif
+
void QTemporaryDirPrivate::create(const QString &templateName)
{
QByteArray buffer = QFile::encodeName(templateName);