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>
This commit is contained in:
parent
4d8a12904a
commit
70c70aef7e
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user