@@ -64,12 +64,16 @@ void kvm_exit(void) __attribute__((noreturn));
void kvm_yield(void);
void tst_res_(const char *file, const int lineno, int result,
- const char *message);
-#define tst_res(result, msg) tst_res_(__FILE__, __LINE__, (result), (msg))
+ const char *fmt, ...)
+ __attribute__ ((format (printf, 4, 5)));
+#define tst_res(result, fmt, ...) \
+ tst_res_(__FILE__, __LINE__, (result), (fmt), ##__VA_ARGS__)
void tst_brk_(const char *file, const int lineno, int result,
- const char *message) __attribute__((noreturn));
-#define tst_brk(result, msg) tst_brk_(__FILE__, __LINE__, (result), (msg))
+ const char *fmt, ...) __attribute__((noreturn))
+ __attribute__ ((format (printf, 4, 5)));
+#define tst_brk(result, fmt, ...) \
+ tst_brk_(__FILE__, __LINE__, (result), (fmt), ##__VA_ARGS__)
/*
* Send asynchronous notification to host without stopping VM execution and
@@ -443,6 +443,7 @@ static void tst_fatal_error(const char *file, const int lineno,
test_result->result = TBROK;
test_result->lineno = lineno;
test_result->file_addr = (uintptr_t)file;
+ /* Avoid sprintf() here in case of bugs */
strcpy(test_result->message, message);
strcat(test_result->message, " at address 0x");
ptr2hex(test_result->message + strlen(test_result->message), ip);
@@ -451,19 +452,46 @@ static void tst_fatal_error(const char *file, const int lineno,
}
void tst_res_(const char *file, const int lineno, int result,
- const char *message)
+ const char *fmt, ...)
{
+ va_list args;
+ int ret;
+
+ va_start(args, fmt);
test_result->result = result;
test_result->lineno = lineno;
test_result->file_addr = (uintptr_t)file;
- strcpy(test_result->message, message);
+ ret = vsprintf(test_result->message, fmt, args);
+ va_end(args);
+
+ if (ret < 0) {
+ tst_brk_(file, lineno, TBROK, "Invalid tst_res() format: %s",
+ fmt);
+ }
+
kvm_yield();
}
void tst_brk_(const char *file, const int lineno, int result,
- const char *message)
+ const char *fmt, ...)
{
- tst_res_(file, lineno, result, message);
+ va_list args;
+ int ret;
+
+ va_start(args, fmt);
+ test_result->result = result;
+ test_result->lineno = lineno;
+ test_result->file_addr = (uintptr_t)file;
+ ret = vsprintf(test_result->message, fmt, args);
+ va_end(args);
+
+ if (ret < 0) {
+ test_result->result = TBROK;
+ strcpy(test_result->message, "Invalid tst_brk() format: ");
+ strcat(test_result->message, fmt);
+ }
+
+ kvm_yield();
kvm_exit();
}
Signed-off-by: Martin Doucha <mdoucha@suse.cz> --- Changes since v1: None testcases/kernel/kvm/include/kvm_guest.h | 12 +++++--- testcases/kernel/kvm/lib_guest.c | 36 +++++++++++++++++++++--- 2 files changed, 40 insertions(+), 8 deletions(-)