]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
lib/posix-process: Make rt_sitgimedwait stub block
authorMarco Schlumpp <marco@unikraft.io>
Wed, 30 Apr 2025 13:33:50 +0000 (15:33 +0200)
committerUnikraft Bot <monkey@unikraft.io>
Fri, 2 May 2025 16:11:03 +0000 (16:11 +0000)
According to rt_sigtimedwait(2) the syscall should return a signal
number on success (> 0) or -1 on failure, so the zero value currently
returned by the stubbed implementation can be misinterpreted by
applications that check against failure. Update the stub to return
implementation to block and never return a signal.

Co-authored-by: Michalis Pappas <michalis@unikraft.io>
Signed-off-by: Marco Schlumpp <marco@unikraft.io>
Signed-off-by: Michalis Pappas <michalis@unikraft.io>
Reviewed-by: Sergiu Moga <sergiu@unikraft.io>
Reviewed-by: Andrei Tatar <andrei@unikraft.io>
Approved-by: Sergiu Moga <sergiu@unikraft.io>
GitHub-Closes: #1639

lib/posix-process/signal/rt_sigtimedwait.c

index bd7fbda47cf57ff9ab9e7e1d2e675dc90f1ec6dc..4fe54762b807fbaeeacb8db8ea2f881c7e2b1ab8 100644 (file)
 #include <uk/syscall.h>
 #include <uk/timeutil.h>
 
+#if !CONFIG_LIBPOSIX_PROCESS_SIGNAL
+#include <uk/plat/time.h>
+#include <uk/sched.h>
+#endif /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */
+
 #include "process.h"
 #include "signal.h"
 
@@ -64,9 +69,31 @@ UK_LLSYSCALL_R_DEFINE(int, rt_sigtimedwait,
                      const struct timespec *, timeout,
                      size_t, sigsetsize)
 {
-       UK_WARN_STUBBED();
+       struct uk_thread *current = uk_thread_current();
+       __nsec timeout_ns;
+       int rc;
+
+       if (timeout) {
+               if (unlikely(!(uk_time_spec_canonical(timeout) &&
+                              uk_time_spec_positive(timeout))))
+                       return -EINVAL;
+               timeout_ns = ukplat_monotonic_clock() +
+                       ukarch_time_sec_to_nsec(timeout->tv_sec) +
+                       timeout->tv_nsec;
+               uk_thread_block_until(current, (__snsec)timeout_ns);
+               uk_sched_yield();
+               rc = -EAGAIN;
+       } else {
+               uk_thread_block(current);
+               uk_sched_yield();
+               /* If this ever returns then just return an EINTR to not
+                * confuse the application
+                */
+               rc = -EINTR;
+       }
+
+       /* We currently never return a signal */
        *info = (siginfo_t){0};
-       info->si_signo = SIGINT;
-       return 0;
+       return rc;
 }
 #endif /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */