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");
|
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)
|
static char *q_mkdtemp(char *templateName)
|
||||||
{
|
{
|
||||||
#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
|
|
||||||
static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
|
|
||||||
const size_t length = strlen(templateName);
|
const size_t length = strlen(templateName);
|
||||||
@ -110,16 +120,11 @@ static char *q_mkdtemp(char *templateName)
|
|||||||
int v = qrand();
|
int v = qrand();
|
||||||
|
|
||||||
/* Fill in the random bits. */
|
/* Fill in the random bits. */
|
||||||
XXXXXX[0] = letters[v % 62];
|
XXXXXX[0] = letters[nextRand(v)];
|
||||||
v /= 62;
|
XXXXXX[1] = letters[nextRand(v)];
|
||||||
XXXXXX[1] = letters[v % 62];
|
XXXXXX[2] = letters[nextRand(v)];
|
||||||
v /= 62;
|
XXXXXX[3] = letters[nextRand(v)];
|
||||||
XXXXXX[2] = letters[v % 62];
|
XXXXXX[4] = letters[nextRand(v)];
|
||||||
v /= 62;
|
|
||||||
XXXXXX[3] = letters[v % 62];
|
|
||||||
v /= 62;
|
|
||||||
XXXXXX[4] = letters[v % 62];
|
|
||||||
v /= 62;
|
|
||||||
XXXXXX[5] = letters[v % 62];
|
XXXXXX[5] = letters[v % 62];
|
||||||
|
|
||||||
QString templateNameStr = QFile::decodeName(templateName);
|
QString templateNameStr = QFile::decodeName(templateName);
|
||||||
@ -137,11 +142,17 @@ static char *q_mkdtemp(char *templateName)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
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)
|
void QTemporaryDirPrivate::create(const QString &templateName)
|
||||||
{
|
{
|
||||||
QByteArray buffer = QFile::encodeName(templateName);
|
QByteArray buffer = QFile::encodeName(templateName);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user