From 589f01684e39c365f20d3252596683e930182e14 Mon Sep 17 00:00:00 2001 From: Wagner Bruna Date: Sun, 20 Sep 2026 08:45:55 -0300 Subject: [PATCH 1/2] fix: avoid passing ggml logs as format strings --- src/core/util.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/util.cpp b/src/core/util.cpp index cf85ebefb..990cddcd5 100644 --- a/src/core/util.cpp +++ b/src/core/util.cpp @@ -651,19 +651,19 @@ void log_printf(sd_log_level_t level, const char* file, int line, const char* fo void sd_ggml_log_callback(ggml_log_level level, const char* text, void*) { switch (level) { case GGML_LOG_LEVEL_DEBUG: - LOG_VERBOSE(text); + LOG_VERBOSE("%s", text); break; case GGML_LOG_LEVEL_INFO: - LOG_INFO(text); + LOG_INFO("%s", text); break; case GGML_LOG_LEVEL_WARN: - LOG_WARN(text); + LOG_WARN("%s", text); break; case GGML_LOG_LEVEL_ERROR: - LOG_ERROR(text); + LOG_ERROR("%s", text); break; default: - LOG_VERBOSE(text); + LOG_VERBOSE("%s", text); } } From 105c3e10995ffdb22c0c52296e24684ddee03239 Mon Sep 17 00:00:00 2001 From: Wagner Bruna Date: Sun, 20 Sep 2026 10:02:47 -0300 Subject: [PATCH 2/2] fix: avoid fixed static buffer for logging Also mark ggml logging as 'ggml' instead of 'util.cpp:NNN'. --- src/core/util.cpp | 73 ++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/src/core/util.cpp b/src/core/util.cpp index 990cddcd5..b90f70ed3 100644 --- a/src/core/util.cpp +++ b/src/core/util.cpp @@ -62,17 +62,34 @@ void replace_all_chars(std::string& str, char target, char replacement) { } } -std::string sd_format(const char* fmt, ...) { - va_list ap; +static std::string sd_vformat(const char* fmt, va_list ap) { + char small[128]; va_list ap2; - va_start(ap, fmt); va_copy(ap2, ap); - int size = vsnprintf(nullptr, 0, fmt, ap); - std::vector buf(size + 1); - int size2 = vsnprintf(buf.data(), size + 1, fmt, ap2); + 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_start(ap, fmt); + 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("%s", text); + sd_level = SD_LOG_VERBOSE; break; case GGML_LOG_LEVEL_INFO: - LOG_INFO("%s", text); + sd_level = SD_LOG_INFO; break; case GGML_LOG_LEVEL_WARN: - LOG_WARN("%s", text); + sd_level = SD_LOG_WARN; break; case GGML_LOG_LEVEL_ERROR: - LOG_ERROR("%s", text); + sd_level = SD_LOG_ERROR; break; default: - LOG_VERBOSE("%s", 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) {