Skip to content

Commit

Permalink
Merge bitcoin#13148: logging: Fix potential use-after-free in LogPrin…
Browse files Browse the repository at this point in the history
…tStr(...)

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
  • Loading branch information
laanwj authored and UdjinM6 committed May 19, 2021
1 parent 3b35792 commit ed72156
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 10 deletions.
17 changes: 8 additions & 9 deletions src/logging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,10 +247,8 @@ std::string BCLog::Logger::LogThreadNameStr(const std::string &str)
return strThreadLogged;
}

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 strThreadLogged = LogThreadNameStr(str);
std::string strTimestamped = LogTimestampStr(strThreadLogged);

Expand All @@ -261,30 +259,31 @@ int BCLog::Logger::LogPrintStr(const std::string &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) {
std::lock_guard<std::mutex> scoped_lock(m_file_mutex);

// buffer if we haven't opened the log yet
if (m_fileout == nullptr) {
ret = strTimestamped.length();
m_msgs_before_open.push_back(strTimestamped);
}
else
{
// reopen the log file, if requested
if (m_reopen_file) {
m_reopen_file = false;
if (fsbridge::freopen(m_file_path,"a",m_fileout) != nullptr)
setbuf(m_fileout, nullptr); // unbuffered
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()
Expand Down
2 changes: 1 addition & 1 deletion src/logging.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,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; }
Expand Down

0 comments on commit ed72156

Please sign in to comment.