diff mbox series

[1/2] kselftest: Add a ksft_perror() helper

Message ID 20230928-ktap-exec-v1-1-1013a2db0426@kernel.org (mailing list archive)
State New
Headers show
Series kselftest/exec: Convert execveat test to KTAP output | expand

Commit Message

Mark Brown Sept. 28, 2023, 2:38 p.m. UTC
The standard library perror() function provides a convenient way to print
an error message based on the current errno but this doesn't play nicely
with KTAP output. Provide a helper which does an equivalent thing in a KTAP
compatible format.

nolibc doesn't have a strerror() and adding the table of strings required
doesn't seem like a good fit for what it's trying to do so when we're using
that only print the errno.

Signed-off-by: Mark Brown <broonie@kernel.org>
---
 tools/testing/selftests/kselftest.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

Comments

Kees Cook Sept. 29, 2023, 12:48 a.m. UTC | #1
On Thu, Sep 28, 2023 at 04:38:11PM +0200, Mark Brown wrote:
> The standard library perror() function provides a convenient way to print
> an error message based on the current errno but this doesn't play nicely
> with KTAP output. Provide a helper which does an equivalent thing in a KTAP
> compatible format.
> 
> nolibc doesn't have a strerror() and adding the table of strings required
> doesn't seem like a good fit for what it's trying to do so when we're using
> that only print the errno.
> 
> Signed-off-by: Mark Brown <broonie@kernel.org>

Oh, interesting... what environment ends up without strerror()?

Reviewed-by: Kees Cook <keescook@chromium.org>
Mark Brown Sept. 29, 2023, 7:50 a.m. UTC | #2
On Thu, Sep 28, 2023 at 05:48:22PM -0700, Kees Cook wrote:

> > nolibc doesn't have a strerror() and adding the table of strings required
> > doesn't seem like a good fit for what it's trying to do so when we're using
> > that only print the errno.

> Oh, interesting... what environment ends up without strerror()?

Like I say it's for nolibc - it's just some header files (all in the
kernel source), while it generally aims to be libc compatible it's
intentionally very small.
Kees Cook Sept. 29, 2023, 5:31 p.m. UTC | #3
On Fri, Sep 29, 2023 at 09:50:53AM +0200, Mark Brown wrote:
> On Thu, Sep 28, 2023 at 05:48:22PM -0700, Kees Cook wrote:
> 
> > > nolibc doesn't have a strerror() and adding the table of strings required
> > > doesn't seem like a good fit for what it's trying to do so when we're using
> > > that only print the errno.
> 
> > Oh, interesting... what environment ends up without strerror()?
> 
> Like I say it's for nolibc - it's just some header files (all in the
> kernel source), while it generally aims to be libc compatible it's
> intentionally very small.

Right, I mean, how would one normally encounter this environment? Running
the selftests on m68k userspace or something?
Mark Brown Oct. 1, 2023, 10:24 a.m. UTC | #4
On Fri, Sep 29, 2023 at 10:31:56AM -0700, Kees Cook wrote:
> On Fri, Sep 29, 2023 at 09:50:53AM +0200, Mark Brown wrote:

> > Like I say it's for nolibc - it's just some header files (all in the
> > kernel source), while it generally aims to be libc compatible it's
> > intentionally very small.

> Right, I mean, how would one normally encounter this environment? Running
> the selftests on m68k userspace or something?

There's a bunch of selftests that cover interfaces that are intended to
be used by libc which are built with nolibc in order to avoid the tests
and glibc stomping over each other.
diff mbox series

Patch

diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h
index 529d29a35900..af9f1202d423 100644
--- a/tools/testing/selftests/kselftest.h
+++ b/tools/testing/selftests/kselftest.h
@@ -48,6 +48,7 @@ 
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdarg.h>
+#include <string.h>
 #include <stdio.h>
 #endif
 
@@ -155,6 +156,19 @@  static inline void ksft_print_msg(const char *msg, ...)
 	va_end(args);
 }
 
+static inline void ksft_perror(const char *msg)
+{
+#ifndef NOLIBC
+	ksft_print_msg("%s: %s (%d)\n", msg, strerror(errno), errno);
+#else
+	/*
+	 * nolibc doesn't provide strerror() and it seems
+	 * inappropriate to add one, just print the errno.
+	 */
+	ksft_print_msg("%s: %d)\n", msg, errno);
+#endif
+}
+
 static inline void ksft_test_result_pass(const char *msg, ...)
 {
 	int saved_errno = errno;