Files
dusklight/src/dusk/OSReport.cpp
T
Phillip Stephens 93e9767c9f Fix OSReport crash on linux, harden FormatToString against malformed strings (#640)
* Fix OSReport crash on linux, harden FormatToString against malformed strings

* Move size increment to after error check

* Update aurora and impl OSPanic

---------

Co-authored-by: Luke Street <luke@street.dev>
2026-05-03 18:50:49 -06:00

118 lines
2.3 KiB
C++

#include <memory>
#include "aurora/lib/logging.hpp"
#include "os_report.h"
aurora::Module Log("dusk::osReport");
bool dusk::OSReportReallyForceEnable = false;
u8 __OSReport_disable;
void OSReportDisable() {
__OSReport_disable = true;
}
void OSReportEnable() {
__OSReport_disable = false;
}
static bool checkEnabled() {
return !__OSReport_disable || dusk::OSReportReallyForceEnable;
}
static std::string FormatToString(const char* msg, va_list list) {
int ret = vsnprintf(nullptr, 0, msg, list);
if (ret <= 0) {
return {};
}
++ret;
std::unique_ptr<char[]> buf(new char[ret]);
vsnprintf(buf.get(), ret, msg, list);
buf[ret - 1] = '\0';
return {buf.get()};
}
void OSReport(const char* fmt, ...) {
if (!checkEnabled()) {
return;
}
va_list args;
va_start(args, fmt);
const auto str = FormatToString(fmt, args);
va_end(args);
Log.info("{}", str);
}
void OSPanic(const char* file, int line, const char* fmt, ...) {
va_list args;
va_start(args, fmt);
const auto str = FormatToString(fmt, args);
va_end(args);
Log.fatal("[{}:{}] {}", file, line, str);
}
void OSReport_Error(const char* fmt, ...) {
if (!checkEnabled()) {
return;
}
va_list args;
va_start(args, fmt);
const auto str = FormatToString(fmt, args);
va_end(args);
Log.error("{}", str);
}
void OSReport_FatalError(const char* fmt, ...) {
if (!checkEnabled()) {
return;
}
va_list args;
va_start(args, fmt);
const auto str = FormatToString(fmt, args);
va_end(args);
Log.fatal("{}", str);
}
void OSReport_Warning(const char* fmt, ...) {
if (!checkEnabled()) {
return;
}
va_list args;
va_start(args, fmt);
const auto str = FormatToString(fmt, args);
va_end(args);
Log.warn("{}", str);
}
void OSReport_System(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
OSVAttention(fmt, args);
va_end(args);
}
void OSVAttention(const char* fmt, va_list args) {
if (!checkEnabled()) {
return;
}
const auto str = FormatToString(fmt, args);
Log.info("{}", str);
}
void OSAttention(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
OSVAttention(fmt, args);
va_end(args);
}