[LTP] [PATCH 3/9] KVM: Implement printf-like formatting for tst_res() and tst_brk()
Martin Doucha
mdoucha@suse.cz
Tue Apr 30 14:21:59 CEST 2024
Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
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 f19bacc39..080d0ac2b 100644
--- a/testcases/kernel/kvm/include/kvm_guest.h
+++ b/testcases/kernel/kvm/include/kvm_guest.h
@@ -68,12 +68,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();
}
--
2.44.0
More information about the ltp
mailing list