util/error: allow non-NUL-terminated err->src

Rust makes the current file available as a statically-allocated string,
but without a NUL terminator.  Allow this by storing an optional maximum
length in the Error.

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2025-05-26 09:25:50 +02:00
parent 8714d366e7
commit 230a4894f4
2 changed files with 11 additions and 3 deletions

View file

@ -18,7 +18,14 @@ struct Error
{ {
char *msg; char *msg;
ErrorClass err_class; ErrorClass err_class;
const char *src, *func; const char *func;
/*
* src might be NUL-terminated or not. If it is, src_len is negative.
* If it is not, src_len is the length.
*/
const char *src;
int src_len;
int line; int line;
GString *hint; GString *hint;
}; };

View file

@ -24,8 +24,8 @@ Error *error_warn;
static void error_handle(Error **errp, Error *err) static void error_handle(Error **errp, Error *err)
{ {
if (errp == &error_abort) { if (errp == &error_abort) {
fprintf(stderr, "Unexpected error in %s() at %s:%d:\n", fprintf(stderr, "Unexpected error in %s() at %.*s:%d:\n",
err->func, err->src, err->line); err->func, err->src_len, err->src, err->line);
error_report("%s", error_get_pretty(err)); error_report("%s", error_get_pretty(err));
if (err->hint) { if (err->hint) {
error_printf("%s", err->hint->str); error_printf("%s", err->hint->str);
@ -67,6 +67,7 @@ static void error_setv(Error **errp,
g_free(msg); g_free(msg);
} }
err->err_class = err_class; err->err_class = err_class;
err->src_len = -1;
err->src = src; err->src = src;
err->line = line; err->line = line;
err->func = func; err->func = func;