mirror of
https://github.com/leejet/stable-diffusion.cpp.git
synced 2026-09-24 20:20:37 +00:00
fix: avoid passing ggml logs as format strings (#2002)
This commit is contained in:
parent
008ca5b492
commit
b8248a869c
@ -62,17 +62,34 @@ void replace_all_chars(std::string& str, char target, char replacement) {
|
||||
}
|
||||
}
|
||||
|
||||
static std::string sd_vformat(const char* fmt, va_list ap) {
|
||||
char small[128];
|
||||
va_list ap2;
|
||||
va_copy(ap2, ap);
|
||||
int size = vsnprintf(small, sizeof small, fmt, ap);
|
||||
if (size < 0) {
|
||||
va_end(ap2);
|
||||
return {};
|
||||
}
|
||||
size_t needed = (size_t)size;
|
||||
if (needed < sizeof small) {
|
||||
va_end(ap2);
|
||||
return std::string(small, needed);
|
||||
}
|
||||
std::string out(needed, '\0');
|
||||
int size2 = vsnprintf(out.data(), needed + 1, fmt, ap2);
|
||||
va_end(ap2);
|
||||
if (size2 < 0)
|
||||
out.clear();
|
||||
return out;
|
||||
}
|
||||
|
||||
std::string sd_format(const char* fmt, ...) {
|
||||
va_list ap;
|
||||
va_list ap2;
|
||||
va_start(ap, fmt);
|
||||
va_copy(ap2, ap);
|
||||
int size = vsnprintf(nullptr, 0, fmt, ap);
|
||||
std::vector<char> buf(size + 1);
|
||||
int size2 = vsnprintf(buf.data(), size + 1, fmt, ap2);
|
||||
va_end(ap2);
|
||||
std::string result = sd_vformat(fmt, ap);
|
||||
va_end(ap);
|
||||
return std::string(buf.data(), size);
|
||||
return result;
|
||||
}
|
||||
|
||||
int round_up_to(int value, int base) {
|
||||
@ -624,47 +641,45 @@ std::string trim(const std::string& s) {
|
||||
static sd_log_cb_t sd_log_cb = nullptr;
|
||||
void* sd_log_cb_data = nullptr;
|
||||
|
||||
#define LOG_BUFFER_SIZE 4096
|
||||
static void sd_log_dispatch(sd_log_level_t level, const std::string& origin, const std::string& text) {
|
||||
if (sd_log_cb == nullptr)
|
||||
return;
|
||||
std::string message = origin + " - " + text;
|
||||
if (message.back() != '\n') {
|
||||
message += '\n';
|
||||
}
|
||||
sd_log_cb(level, message.c_str(), sd_log_cb_data);
|
||||
}
|
||||
|
||||
void log_printf(sd_log_level_t level, const char* file, int line, const char* format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
|
||||
static char log_buffer[LOG_BUFFER_SIZE + 1];
|
||||
int written = snprintf(log_buffer, LOG_BUFFER_SIZE, "%s:%-4d - ", sd_basename(file).c_str(), line);
|
||||
|
||||
if (written >= 0 && written < LOG_BUFFER_SIZE) {
|
||||
vsnprintf(log_buffer + written, LOG_BUFFER_SIZE - written, format, args);
|
||||
}
|
||||
size_t len = strlen(log_buffer);
|
||||
if (log_buffer[len - 1] != '\n') {
|
||||
strncat(log_buffer, "\n", LOG_BUFFER_SIZE - len);
|
||||
}
|
||||
|
||||
if (sd_log_cb) {
|
||||
sd_log_cb(level, log_buffer, sd_log_cb_data);
|
||||
}
|
||||
|
||||
std::string message = sd_vformat(format, args);
|
||||
va_end(args);
|
||||
std::string origin = sd_format("%s:%-4d", sd_basename(file).c_str(), line);
|
||||
sd_log_dispatch(level, origin, message);
|
||||
}
|
||||
|
||||
void sd_ggml_log_callback(ggml_log_level level, const char* text, void*) {
|
||||
sd_log_level_t sd_level = SD_LOG_VERBOSE;
|
||||
switch (level) {
|
||||
case GGML_LOG_LEVEL_DEBUG:
|
||||
LOG_VERBOSE(text);
|
||||
sd_level = SD_LOG_VERBOSE;
|
||||
break;
|
||||
case GGML_LOG_LEVEL_INFO:
|
||||
LOG_INFO(text);
|
||||
sd_level = SD_LOG_INFO;
|
||||
break;
|
||||
case GGML_LOG_LEVEL_WARN:
|
||||
LOG_WARN(text);
|
||||
sd_level = SD_LOG_WARN;
|
||||
break;
|
||||
case GGML_LOG_LEVEL_ERROR:
|
||||
LOG_ERROR(text);
|
||||
sd_level = SD_LOG_ERROR;
|
||||
break;
|
||||
default:
|
||||
LOG_VERBOSE(text);
|
||||
sd_level = SD_LOG_VERBOSE;
|
||||
break;
|
||||
}
|
||||
sd_log_dispatch(sd_level, "ggml", text);
|
||||
}
|
||||
|
||||
void sd_set_log_callback(sd_log_cb_t cb, void* data) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user