selftests/nolibc: correctly report errors from printf() and friends

When an error is encountered by printf() it needs to be reported.
errno() is already set by the callback.

sprintf() is different, but that keeps working and is already tested.

Also add a new test.

Fixes: 7e4346f4a3 ("tools/nolibc/stdio: add a minimal [vf]printf() implementation")
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/r/20250704-nolibc-printf-error-v1-2-74b7a092433b@linutronix.de
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
This commit is contained in:
Thomas Weißschuh
2025-07-06 11:02:40 +02:00
committed by Thomas Weißschuh
parent 2b1ed5f7f8
commit 4a40129087
2 changed files with 25 additions and 2 deletions
+2 -2
View File
@@ -358,11 +358,11 @@ int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char
n -= w;
while (width-- > w) {
if (cb(state, " ", 1) != 0)
break;
return -1;
written += 1;
}
if (cb(state, outstr, w) != 0)
break;
return -1;
}
written += len;
@@ -1662,6 +1662,28 @@ int test_strerror(void)
return 0;
}
static int test_printf_error(void)
{
int fd, ret, saved_errno;
fd = open("/dev/full", O_RDWR);
if (fd == -1)
return 1;
errno = 0;
ret = dprintf(fd, "foo");
saved_errno = errno;
close(fd);
if (ret != -1)
return 2;
if (saved_errno != ENOSPC)
return 3;
return 0;
}
static int run_printf(int min, int max)
{
int test;
@@ -1691,6 +1713,7 @@ static int run_printf(int min, int max)
CASE_TEST(width_trunc); EXPECT_VFPRINTF(25, " ", "%25d", 1); break;
CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break;
CASE_TEST(strerror); EXPECT_ZR(1, test_strerror()); break;
CASE_TEST(printf_error); EXPECT_ZR(1, test_printf_error()); break;
case __LINE__:
return ret; /* must be last */
/* note: do not set any defaults so as to permit holes above */