Changeset - r28505:5212736360c6
[Not reviewed]
master
0 3 0
Peter Nelson - 11 months ago 2023-12-30 00:07:51
peter1138@openttd.org
Fix #11646: Non-thread safe shared buffer returned from GetLogPrefix().

Return string from GetLogPrefix instead of shared string's buffer.
3 files changed with 10 insertions and 13 deletions:
0 comments (0 inline, 0 general)
src/console.cpp
Show inline comments
 
@@ -48,16 +48,15 @@ void IConsoleInit()
 
}
 

	
 
static void IConsoleWriteToLogFile(const std::string &string)
 
{
 
	if (_iconsole_output_file != nullptr) {
 
		/* if there is an console output file ... also print it there */
 
		const char *header = GetLogPrefix();
 
		if ((strlen(header) != 0 && fwrite(header, strlen(header), 1, _iconsole_output_file) != 1) ||
 
				fwrite(string.c_str(), string.size(), 1, _iconsole_output_file) != 1 ||
 
				fwrite("\n", 1, 1, _iconsole_output_file) != 1) {
 
		try {
 
			fmt::print(_iconsole_output_file, "{}{}\n", GetLogPrefix(), string);
 
		} catch (const std::system_error &) {
 
			fclose(_iconsole_output_file);
 
			_iconsole_output_file = nullptr;
 
			IConsolePrint(CC_ERROR, "Cannot write to console log file; closing the log file.");
 
		}
 
	}
 
}
src/debug.cpp
Show inline comments
 
@@ -216,24 +216,22 @@ std::string GetDebugString()
 
	}
 
	return result;
 
}
 

	
 
/**
 
 * Get the prefix for logs; if show_date_in_logs is enabled it returns
 
 * the date, otherwise it returns nothing.
 
 * @return the prefix for logs (do not free), never nullptr
 
 * the date, otherwise it returns an empty string.
 
 * @return the prefix for logs.
 
 */
 
const char *GetLogPrefix()
 
std::string GetLogPrefix()
 
{
 
	static std::string _log_prefix;
 
	std::string log_prefix;
 
	if (_settings_client.gui.show_date_in_logs) {
 
		_log_prefix = fmt::format("[{:%Y-%m-%d %H:%M:%S}] ", fmt::localtime(time(nullptr)));
 
	} else {
 
		_log_prefix.clear();
 
		log_prefix = fmt::format("[{:%Y-%m-%d %H:%M:%S}] ", fmt::localtime(time(nullptr)));
 
	}
 
	return _log_prefix.c_str();
 
	return log_prefix;
 
}
 

	
 
/**
 
 * Send the queued Debug messages to either NetworkAdminConsole or IConsolePrint from the
 
 * GameLoop thread to prevent concurrent accesses to both the NetworkAdmin's packet queue
 
 * as well as IConsolePrint's buffers.
src/debug.h
Show inline comments
 
@@ -117,12 +117,12 @@ std::string GetDebugString();
 
}
 

	
 

	
 
void ShowInfoI(const std::string &str);
 
#define ShowInfo(format_string, ...) ShowInfoI(fmt::format(FMT_STRING(format_string), ## __VA_ARGS__))
 

	
 
const char *GetLogPrefix();
 
std::string GetLogPrefix();
 

	
 
void DebugSendRemoteMessages();
 
void DebugReconsiderSendRemoteMessages();
 

	
 
#endif /* DEBUG_H */
0 comments (0 inline, 0 general)