]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tools/nolibc: fix error return value of clock_nanosleep()
authorThomas Weißschuh <thomas.weissschuh@linutronix.de>
Thu, 31 Jul 2025 08:00:31 +0000 (10:00 +0200)
committerThomas Weißschuh <linux@weissschuh.net>
Sun, 17 Aug 2025 09:42:09 +0000 (11:42 +0200)
clock_nanosleep() returns a positive error value. Unlike other libc
functions it *does not* return -1 nor set errno.

Fix the return value and also adapt nanosleep().

Fixes: 7c02bc4088af ("tools/nolibc: add support for clock_nanosleep() and nanosleep()")
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/r/20250731-nolibc-clock_nanosleep-ret-v1-1-9e4af7855e61@linutronix.de
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
tools/include/nolibc/time.h
tools/testing/selftests/nolibc/nolibc-test.c

index d02bc44d2643a5e39afa808841f7175bfab5ff7e..e9c1b976791a65c0d73268bebbcfd4f2a57a47ee 100644 (file)
@@ -133,7 +133,8 @@ static __attribute__((unused))
 int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp,
                    struct timespec *rmtp)
 {
-       return __sysret(sys_clock_nanosleep(clockid, flags, rqtp, rmtp));
+       /* Directly return a positive error number */
+       return -sys_clock_nanosleep(clockid, flags, rqtp, rmtp);
 }
 
 static __inline__
@@ -145,7 +146,7 @@ double difftime(time_t time1, time_t time2)
 static __inline__
 int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
 {
-       return clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rmtp);
+       return __sysret(sys_clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rmtp));
 }
 
 
index a297ee0d6d0754dfcd9f9e5609d42c7442dabc4e..cc4d730ac4656fb5944d50be9477a3dfefb00aa0 100644 (file)
@@ -1334,6 +1334,7 @@ int run_syscall(int min, int max)
                CASE_TEST(chroot_root);       EXPECT_SYSZR(euid0, chroot("/")); break;
                CASE_TEST(chroot_blah);       EXPECT_SYSER(1, chroot("/proc/self/blah"), -1, ENOENT); break;
                CASE_TEST(chroot_exe);        EXPECT_SYSER(1, chroot(argv0), -1, ENOTDIR); break;
+               CASE_TEST(clock_nanosleep);   ts.tv_nsec = -1; EXPECT_EQ(1, EINVAL, clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL)); break;
                CASE_TEST(close_m1);          EXPECT_SYSER(1, close(-1), -1, EBADF); break;
                CASE_TEST(close_dup);         EXPECT_SYSZR(1, close(dup(0))); break;
                CASE_TEST(dup_0);             tmp = dup(0);  EXPECT_SYSNE(1, tmp, -1); close(tmp); break;