Merge pull request #4392
8ae973c
Allocate more space if necessary in RandSeedAddPerfMon (Wladimir J. van der Laan)be873f6
Issue warning if collecting RandSeed data failed (Wladimir J. van der Laan)fcb0a1b
change "char pch[200000]" to "new char[200000]" (daniel)
This commit is contained in:
commit
eacff4a9c6
1 changed files with 26 additions and 11 deletions
37
src/util.cpp
37
src/util.cpp
|
@ -167,16 +167,31 @@ void RandAddSeedPerfmon()
|
|||
#ifdef WIN32
|
||||
// Don't need this on Linux, OpenSSL automatically uses /dev/urandom
|
||||
// Seed with the entire set of perfmon data
|
||||
unsigned char pdata[250000];
|
||||
memset(pdata, 0, sizeof(pdata));
|
||||
unsigned long nSize = sizeof(pdata);
|
||||
long ret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, pdata, &nSize);
|
||||
std::vector <unsigned char> vData(250000,0);
|
||||
long ret = 0;
|
||||
unsigned long nSize = 0;
|
||||
const size_t nMaxSize = 10000000; // Bail out at more than 10MB of performance data
|
||||
while (true)
|
||||
{
|
||||
nSize = vData.size();
|
||||
ret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, begin_ptr(vData), &nSize);
|
||||
if (ret != ERROR_MORE_DATA || vData.size() >= nMaxSize)
|
||||
break;
|
||||
vData.resize(std::max((vData.size()*3)/2, nMaxSize)); // Grow size of buffer exponentially
|
||||
}
|
||||
RegCloseKey(HKEY_PERFORMANCE_DATA);
|
||||
if (ret == ERROR_SUCCESS)
|
||||
{
|
||||
RAND_add(pdata, nSize, nSize/100.0);
|
||||
OPENSSL_cleanse(pdata, nSize);
|
||||
LogPrint("rand", "RandAddSeed() %lu bytes\n", nSize);
|
||||
RAND_add(begin_ptr(vData), nSize, nSize/100.0);
|
||||
OPENSSL_cleanse(begin_ptr(vData), nSize);
|
||||
LogPrint("rand", "%s: %lu bytes\n", __func__, nSize);
|
||||
} else {
|
||||
static bool warned = false; // Warn only once
|
||||
if (!warned)
|
||||
{
|
||||
LogPrintf("%s: Warning: RegQueryValueExA(HKEY_PERFORMANCE_DATA) failed with code %i\n", __func__, ret);
|
||||
warned = true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -1140,15 +1155,15 @@ void ShrinkDebugFile()
|
|||
if (file && boost::filesystem::file_size(pathLog) > 10 * 1000000)
|
||||
{
|
||||
// Restart the file with some of the end
|
||||
char pch[200000];
|
||||
fseek(file, -sizeof(pch), SEEK_END);
|
||||
int nBytes = fread(pch, 1, sizeof(pch), file);
|
||||
std::vector <char> vch(200000,0);
|
||||
fseek(file, -vch.size(), SEEK_END);
|
||||
int nBytes = fread(begin_ptr(vch), 1, vch.size(), file);
|
||||
fclose(file);
|
||||
|
||||
file = fopen(pathLog.string().c_str(), "w");
|
||||
if (file)
|
||||
{
|
||||
fwrite(pch, 1, nBytes, file);
|
||||
fwrite(begin_ptr(vch), 1, nBytes, file);
|
||||
fclose(file);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue