Browse Source

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)
0.10
Wladimir J. van der Laan 11 years ago
parent
commit
eacff4a9c6
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 37
      src/util.cpp

37
src/util.cpp

@ -167,16 +167,31 @@ void RandAddSeedPerfmon()
#ifdef WIN32 #ifdef WIN32
// Don't need this on Linux, OpenSSL automatically uses /dev/urandom // Don't need this on Linux, OpenSSL automatically uses /dev/urandom
// Seed with the entire set of perfmon data // Seed with the entire set of perfmon data
unsigned char pdata[250000]; std::vector <unsigned char> vData(250000,0);
memset(pdata, 0, sizeof(pdata)); long ret = 0;
unsigned long nSize = sizeof(pdata); unsigned long nSize = 0;
long ret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, pdata, &nSize); 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); RegCloseKey(HKEY_PERFORMANCE_DATA);
if (ret == ERROR_SUCCESS) if (ret == ERROR_SUCCESS)
{ {
RAND_add(pdata, nSize, nSize/100.0); RAND_add(begin_ptr(vData), nSize, nSize/100.0);
OPENSSL_cleanse(pdata, nSize); OPENSSL_cleanse(begin_ptr(vData), nSize);
LogPrint("rand", "RandAddSeed() %lu bytes\n", 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 #endif
} }
@ -1140,15 +1155,15 @@ void ShrinkDebugFile()
if (file && boost::filesystem::file_size(pathLog) > 10 * 1000000) if (file && boost::filesystem::file_size(pathLog) > 10 * 1000000)
{ {
// Restart the file with some of the end // Restart the file with some of the end
char pch[200000]; std::vector <char> vch(200000,0);
fseek(file, -sizeof(pch), SEEK_END); fseek(file, -vch.size(), SEEK_END);
int nBytes = fread(pch, 1, sizeof(pch), file); int nBytes = fread(begin_ptr(vch), 1, vch.size(), file);
fclose(file); fclose(file);
file = fopen(pathLog.string().c_str(), "w"); file = fopen(pathLog.string().c_str(), "w");
if (file) if (file)
{ {
fwrite(pch, 1, nBytes, file); fwrite(begin_ptr(vch), 1, nBytes, file);
fclose(file); fclose(file);
} }
} }

Loading…
Cancel
Save