aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2026-07-23 15:52:05 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2026-07-23 15:52:05 +0000
commit82e0628b934630fadd3d3759b27356da156baaa3 (patch)
tree211fb91c491c76c6eed7adeaa7344ae6019ed35b
parent23d265243887dd549f6806f985a07473a22120dc (diff)
downloads6-82e0628b934630fadd3d3759b27356da156baaa3.tar.gz
systemd sends READY=1 without a terminating newline
-rw-r--r--src/supervision/s6-notify-fd-from-socket.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/src/supervision/s6-notify-fd-from-socket.c b/src/supervision/s6-notify-fd-from-socket.c
index 834955d..625f57a 100644
--- a/src/supervision/s6-notify-fd-from-socket.c
+++ b/src/supervision/s6-notify-fd-from-socket.c
@@ -41,11 +41,11 @@ static void bindit (int sock, char *name)
struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = "" } ;
socklen_t addrlen = sizeof(struct sockaddr_un) ;
if (bind(sock, (struct sockaddr *)&addr, sizeof(sa_family_t)) == -1) /* autobind */
- strerr_diefu1sys(111, "bind") ;
+ strerr_diefusys(111, "bind") ;
if (getsockname(sock, (struct sockaddr *)&addr, &addrlen) == -1)
- strerr_diefu1sys(111, "getsockname") ;
+ strerr_diefusys(111, "getsockname") ;
if (addr.sun_path[0])
- strerr_diefu1x(111, "autobind to an abstract socket") ;
+ strerr_diefu(111, "autobind to an abstract socket") ;
memcpy(name, addr.sun_path + 1, 5) ;
name[5] = 0 ;
}
@@ -54,27 +54,30 @@ static inline int run_child (int sock, int fd, unsigned int timeout)
{
char buf[8192] ;
iopause_fd x = { .fd = sock, .events = IOPAUSE_READ } ;
- int found = 0 ;
tain deadline = TAIN_INFINITE_RELATIVE ;
tain_now_g() ;
if (timeout) tain_from_millisecs(&deadline, timeout) ;
tain_add_g(&deadline, &deadline) ;
- while (!found)
+ for (;;)
{
int r = iopause_g(&x, 1, &deadline) ;
if (r == -1) strerr_diefu1sys(111, "iopause") ;
- if (!r) strerr_dief1x(99, "timed out waiting for notification") ;
+ if (!r) strerr_dief(99, "timed out waiting for notification") ;
r = sanitize_read(fd_recv(sock, buf, 8191, 0)) ;
if (r == -1)
{
if (errno == EPIPE) _exit(0) ;
- else strerr_diefu1sys(111, "recv") ;
+ else strerr_diefusys(111, "recv") ;
}
if (r)
{
buf[r++] = 0 ;
- if (!strncmp(buf, "READY=1\n", 8) || strstr(buf, "\nREADY=1\n"))
- found = 1 ;
+ if (!strncmp(buf, "READY=1", 7) && (!buf[7] || buf[7] == '\n')) break ;
+ else
+ {
+ char *s = strstr(buf, "\nREADY=1\n") ;
+ if (s && (!s[8] || s[8] == '\n')) break ;
+ }
}
}
fd_write(fd, "\n", 1) ;
@@ -117,27 +120,27 @@ int main (int argc, char const *const *argv)
if (!argc) dieusage() ;
if (wgola[GOLA_TIMEOUT] && !uint0_scan(wgola[GOLA_TIMEOUT], &timeout))
- strerr_dief2x(100, "timeout", " must be an unsigned integer") ;
+ strerr_dief(100, "timeout", " must be an unsigned integer") ;
if (wgola[GOLA_NOTIF])
{
if (!uint0_scan(wgola[GOLA_NOTIF], &fd))
- strerr_dief2x(100, "notification-fd", " must be an unsigned integer") ;
+ strerr_dief(100, "notification-fd", " must be an unsigned integer") ;
}
else
{
int r = read_uint("notification-fd", &fd) ;
if (r == -1) strerr_diefu2sys(111, "read ", "./notification-fd") ;
- if (!r) strerr_dief2x(100, "invalid ", "./notification-fd") ;
+ if (!r) strerr_dief(100, "invalid ", "./notification-fd") ;
}
if (fcntl(fd, F_GETFD) == -1)
- strerr_dief2sys(111, "notification-fd", " sanity check failed") ;
+ strerr_diefsys(111, "notification-fd", " sanity check failed") ;
sock = ipc_datagram_nbcoe() ;
- if (sock == -1) strerr_diefu1sys(111, "create socket") ;
+ if (sock == -1) strerr_diefusys(111, "create socket") ;
bindit(sock, modif + 15) ;
pid = wgolb & GOLB_SINGLEFORK ? fork() : doublefork() ;
- if (pid == -1) strerr_diefu1sys(111, wgolb & GOLB_SINGLEFORK ? "fork" : "doublefork") ;
+ if (pid == -1) strerr_diefusys(111, wgolb & GOLB_SINGLEFORK ? "fork" : "doublefork") ;
if (!pid) run_child(sock, fd, timeout) ;
fd_close(sock) ;
fd_close(fd) ;