From: Paolo Bonzini Date: Mon, 26 May 2025 07:25:50 +0000 (+0200) Subject: util/error: allow non-NUL-terminated err->src X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=230a4894f45eac5fbd6bea8dc0dd54f84cf6c0fa;p=thirdparty%2Fqemu.git 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 Signed-off-by: Paolo Bonzini --- diff --git a/include/qapi/error-internal.h b/include/qapi/error-internal.h index d5c3904ade..1ec3ceb40f 100644 --- a/include/qapi/error-internal.h +++ b/include/qapi/error-internal.h @@ -18,7 +18,14 @@ struct Error { char *msg; 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; GString *hint; }; diff --git a/util/error.c b/util/error.c index e5bcb7c022..3449ecc0b9 100644 --- a/util/error.c +++ b/util/error.c @@ -24,8 +24,8 @@ Error *error_warn; static void error_handle(Error **errp, Error *err) { if (errp == &error_abort) { - fprintf(stderr, "Unexpected error in %s() at %s:%d:\n", - err->func, err->src, err->line); + fprintf(stderr, "Unexpected error in %s() at %.*s:%d:\n", + err->func, err->src_len, err->src, err->line); error_report("%s", error_get_pretty(err)); if (err->hint) { error_printf("%s", err->hint->str); @@ -67,6 +67,7 @@ static void error_setv(Error **errp, g_free(msg); } err->err_class = err_class; + err->src_len = -1; err->src = src; err->line = line; err->func = func;