Re: [PATCH v10 8/9] kselftest: save-and-restore errno to allow for %m formatting

shuah
2019-07-19T22:25:46Z

On 7/19/19 10:42 AM, Aleksa Sarai wrote:
> Previously, using "%m" in a ksft_* format string can result in strange
> output because the errno value wasn't saved before calling other libc
> functions. The solution is to simply save and restore the errno before
> we format the user-supplied format string.
>
> Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
> ---
> tools/testing/selftests/kselftest.h | 15 +++++++++++++++
> 1 file changed, 15 insertions(+)
>
> diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h
> index ec15c4f6af55..0ac49d91a260 100644
> --- a/tools/testing/selftests/kselftest.h
> +++ b/tools/testing/selftests/kselftest.h
> @@ -10,6 +10,7 @@
> #ifndef __KSELFTEST_H
> #define __KSELFTEST_H
>
> +#include <errno.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <stdarg.h>
> @@ -81,58 +82,68 @@ static inline void ksft_print_cnts(void)
>
> static inline void ksft_print_msg(const char *msg, ...)
> {
> + int saved_errno = errno;
> va_list args;
>
> va_start(args, msg);
> printf("# ");
> + errno = saved_errno;
> vprintf(msg, args);
> va_end(args);
> }
>
> static inline void ksft_test_result_pass(const char *msg, ...)
> {
> + int saved_errno = errno;
> va_list args;
>
> ksft_cnt.ksft_pass++;
>
> va_start(args, msg);
> printf("ok %d ", ksft_test_num());
> + errno = saved_errno;
> vprintf(msg, args);
> va_end(args);
> }
>
> static inline void ksft_test_result_fail(const char *msg, ...)
> {
> + int saved_errno = errno;
> va_list args;
>
> ksft_cnt.ksft_fail++;
>
> va_start(args, msg);
> printf("not ok %d ", ksft_test_num());
> + errno = saved_errno;
> vprintf(msg, args);
> va_end(args);
> }
>
> static inline void ksft_test_result_skip(const char *msg, ...)
> {
> + int saved_errno = errno;
> va_list args;
>
> ksft_cnt.ksft_xskip++;
>
> va_start(args, msg);
> printf("not ok %d # SKIP ", ksft_test_num());
> + errno = saved_errno;
> vprintf(msg, args);
> va_end(args);
> }
>
> static inline void ksft_test_result_error(const char *msg, ...)
> {
> + int saved_errno = errno;
> va_list args;
>
> ksft_cnt.ksft_error++;
>
> va_start(args, msg);
> printf("not ok %d # error ", ksft_test_num());
> + errno = saved_errno;
> vprintf(msg, args);
> va_end(args);
> }
> @@ -152,10 +163,12 @@ static inline int ksft_exit_fail(void)
>
> static inline int ksft_exit_fail_msg(const char *msg, ...)
> {
> + int saved_errno = errno;
> va_list args;
>
> va_start(args, msg);
> printf("Bail out! ");
> + errno = saved_errno;
> vprintf(msg, args);
> va_end(args);
>
> @@ -178,10 +191,12 @@ static inline int ksft_exit_xpass(void)
> static inline int ksft_exit_skip(const char *msg, ...)
> {
> if (msg) {
> + int saved_errno = errno;
> va_list args;
>
> va_start(args, msg);
> printf("not ok %d # SKIP ", 1 + ksft_test_num());
> + errno = saved_errno;
> vprintf(msg, args);
> va_end(args);
> } else {
>

Hi Aleksa,

Can you send this patch separate from the patch series. I will apply
this as bug fix to 5.3-rc2 or rc3.

This isn't part of this series anyway and I would like to get this in
right away.

thanks,
-- Shuah