Merge #13148: logging: Fix potential use-after-free in LogPrintStr(...)

0bd4cd3 logging: remove unused return value from LogPrintStr (practicalswift)
76f344d logging: Fix potential use-after-free in LogPrintStr(...) (practicalswift)

Pull request description:

  Fix potential use-after-free in `LogPrintStr(...)`.

  `freopen(…)` frees `m_fileout`.

Tree-SHA512: ceee1f659c10a21525aa648377afeea0a37016339f5269dea54850ba3b475aa316f4931081655717b65f981598fdc9d79a1e79e55f7084c242eeb7bf372bc4b6
pull/585/head
Wladimir J. van der Laan 7 years ago
commit b62b437acd
No known key found for this signature in database
GPG Key ID: 1E4AED62986CD25D

@ -198,15 +198,13 @@ std::string BCLog::Logger::LogTimestampStr(const std::string &str)
return strStamped;
}
int BCLog::Logger::LogPrintStr(const std::string &str)
void BCLog::Logger::LogPrintStr(const std::string &str)
{
int ret = 0; // Returns total number of characters written
std::string strTimestamped = LogTimestampStr(str);
if (m_print_to_console) {
// print to console
ret = fwrite(strTimestamped.data(), 1, strTimestamped.size(), stdout);
fwrite(strTimestamped.data(), 1, strTimestamped.size(), stdout);
fflush(stdout);
}
if (m_print_to_file) {
@ -214,7 +212,6 @@ int BCLog::Logger::LogPrintStr(const std::string &str)
// buffer if we haven't opened the log yet
if (m_fileout == nullptr) {
ret = strTimestamped.length();
m_msgs_before_open.push_back(strTimestamped);
}
else
@ -222,14 +219,16 @@ int BCLog::Logger::LogPrintStr(const std::string &str)
// reopen the log file, if requested
if (m_reopen_file) {
m_reopen_file = false;
if (fsbridge::freopen(m_file_path,"a",m_fileout) != nullptr)
m_fileout = fsbridge::freopen(m_file_path, "a", m_fileout);
if (!m_fileout) {
return;
}
setbuf(m_fileout, nullptr); // unbuffered
}
ret = FileWriteStr(strTimestamped, m_fileout);
FileWriteStr(strTimestamped, m_fileout);
}
}
return ret;
}
void BCLog::Logger::ShrinkDebugFile()

@ -86,7 +86,7 @@ namespace BCLog {
std::atomic<bool> m_reopen_file{false};
/** Send a string to the log output */
int LogPrintStr(const std::string &str);
void LogPrintStr(const std::string &str);
/** Returns whether logs will be written to any output */
bool Enabled() const { return m_print_to_console || m_print_to_file; }

Loading…
Cancel
Save