From 58c02e5fee86a059231fec3bc80b44774b1d603c Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Wed, 27 May 2026 02:35:28 +0000 Subject: iopause: limit spurious returns. sarealpath: align no PATH_MAX case. --- src/libstddjb/iopause_select.c | 2 +- src/libstddjb/iopause_stamp.c | 22 ++++++++++++++++------ src/libstddjb/sarealpath.c | 2 ++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/libstddjb/iopause_select.c b/src/libstddjb/iopause_select.c index 6ca2f20..8cf0b87 100644 --- a/src/libstddjb/iopause_select.c +++ b/src/libstddjb/iopause_select.c @@ -31,7 +31,7 @@ int iopause_select (iopause_fd *x, unsigned int len, tain const *deadline, tain else deadline = 0 ; } #ifndef SKALIBS_HASSELECTINFINITE - if (deadline && tv.tv_sec >= 100000000) + if (tv.tv_sec >= 100000000) { tv.tv_sec = 100000000 ; tv.tv_usec = 0 ; diff --git a/src/libstddjb/iopause_stamp.c b/src/libstddjb/iopause_stamp.c index 890909b..0eb546b 100644 --- a/src/libstddjb/iopause_stamp.c +++ b/src/libstddjb/iopause_stamp.c @@ -8,10 +8,20 @@ int iopause_stamp (iopause_fd *x, unsigned int n, tain const *deadline, tain *stamp) { int e = errno ; - int r ; - do r = iopause(x, n, deadline, stamp) ; - while (r == -1 && errno == EINTR) ; - if (stamp) tain_now(stamp) ; - if (r >= 0) errno = e ; - return r ; + for (;;) + { + int r = iopause(x, n, deadline, stamp) ; + if (r == -1) + { + if (errno != EINTR) return -1 ; + if (stamp) tain_now(stamp) ; + } + else + { + if (stamp) tain_now(stamp) ; + errno = e ; + if (r > 0) return r ; + if (deadline && stamp && !tain_less(stamp, deadline)) return 0 ; + } + } } diff --git a/src/libstddjb/sarealpath.c b/src/libstddjb/sarealpath.c index 8c994c4..ff4ee4f 100644 --- a/src/libstddjb/sarealpath.c +++ b/src/libstddjb/sarealpath.c @@ -3,6 +3,7 @@ #include #include #include + #include #include @@ -23,6 +24,7 @@ int sarealpath (stralloc *sa, char const *path) return -1 ; } free(p) ; + sa->len-- ; #endif } else -- cgit v1.3.1