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:
committed by
Thomas Weißschuh
parent
2b1ed5f7f8
commit
4a40129087
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user