[LTP] [PATCH v2 3/4] KVM: Implement printf-like formatting for tst_res() and tst_brk()

Martin Doucha
2024-05-14T12:08:32Z

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(-)

diff --git a/testcases/kernel/kvm/include/kvm_guest.h b/testcases/kernel/kvm/include/kvm_guest.h
index 3cfafa313..0eabfb9a0 100644
--- a/testcases/kernel/kvm/include/kvm_guest.h
+++ b/testcases/kernel/kvm/include/kvm_guest.h
@@ -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
diff --git a/testcases/kernel/kvm/lib_guest.c b/testcases/kernel/kvm/lib_guest.c
index 73a76ccb1..2e3e9cb6e 100644
--- a/testcases/kernel/kvm/lib_guest.c
+++ b/testcases/kernel/kvm/lib_guest.c
@@ -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();
}