commit d864419

Michael Forney  ·  2025-02-02 09:46:07 +0000 UTC
parent 28abe26
bubblewrap: Update to 0.11.0
8 files changed,  +305, -64
+1, -1
1@@ -1 +1 @@
2-#define PACKAGE_STRING "bubblewrap 0.8.0"
3+#define PACKAGE_STRING "bubblewrap 0.11.0"
+11, -11
 1@@ -1,4 +1,4 @@
 2-From f399ecdc5cc4a3d6563b9ea3c8984c3832d655ea Mon Sep 17 00:00:00 2001
 3+From 5b70e5f6af8d0688b8947c649acc2904cce96d3b Mon Sep 17 00:00:00 2001
 4 From: Michael Forney <mforney@mforney.org>
 5 Date: Tue, 4 Jul 2023 10:44:15 -0700
 6 Subject: [PATCH] utils: Avoid unnecessary VLAs
 7@@ -8,18 +8,18 @@ Subject: [PATCH] utils: Avoid unnecessary VLAs
 8  1 file changed, 4 insertions(+), 6 deletions(-)
 9 
10 diff --git a/utils.c b/utils.c
11-index 693273b..6845283 100644
12+index 51875ae..8ab89bb 100644
13 --- a/utils.c
14 +++ b/utils.c
15-@@ -727,15 +727,14 @@ send_pid_on_socket (int socket)
16+@@ -758,15 +758,14 @@ send_pid_on_socket (int sockfd)
17    char buf[1] = { 0 };
18    struct msghdr msg = {};
19    struct iovec iov = { buf, sizeof (buf) };
20 -  const ssize_t control_len_snd = CMSG_SPACE(sizeof(struct ucred));
21--  char control_buf_snd[control_len_snd];
22-+  char control_buf_snd[CMSG_SPACE(sizeof(struct ucred))];
23+-  _Alignas(struct cmsghdr) char control_buf_snd[control_len_snd];
24++  _Alignas(struct cmsghdr) char control_buf_snd[CMSG_SPACE(sizeof(struct ucred))];
25    struct cmsghdr *cmsg;
26-   struct ucred *cred;
27+   struct ucred cred;
28  
29    msg.msg_iov = &iov;
30    msg.msg_iovlen = 1;
31@@ -29,13 +29,13 @@ index 693273b..6845283 100644
32  
33    cmsg = CMSG_FIRSTHDR(&msg);
34    cmsg->cmsg_level = SOL_SOCKET;
35-@@ -769,14 +768,13 @@ read_pid_from_socket (int socket)
36+@@ -800,14 +799,13 @@ read_pid_from_socket (int sockfd)
37    char recv_buf[1] = { 0 };
38    struct msghdr msg = {};
39    struct iovec iov = { recv_buf, sizeof (recv_buf) };
40 -  const ssize_t control_len_rcv = CMSG_SPACE(sizeof(struct ucred));
41--  char control_buf_rcv[control_len_rcv];
42-+  char control_buf_rcv[CMSG_SPACE(sizeof(struct ucred))];
43+-  _Alignas(struct cmsghdr) char control_buf_rcv[control_len_rcv];
44++  _Alignas(struct cmsghdr) char control_buf_rcv[CMSG_SPACE(sizeof(struct ucred))];
45    struct cmsghdr* cmsg;
46  
47    msg.msg_iov = &iov;
48@@ -44,8 +44,8 @@ index 693273b..6845283 100644
49 -  msg.msg_controllen = control_len_rcv;
50 +  msg.msg_controllen = sizeof (control_buf_rcv);
51  
52-   if (recvmsg (socket, &msg, 0) < 0)
53+   if (TEMP_FAILURE_RETRY (recvmsg (sockfd, &msg, 0)) < 0)
54      die_with_error ("Can't read pid from socket");
55 -- 
56-2.37.3
57+2.44.0
58 
+6, -6
 1@@ -1,4 +1,4 @@
 2-From 21b0b65179640a795394a9664862d797aaca9120 Mon Sep 17 00:00:00 2001
 3+From c1dc134f5f2591d364907a2e6102848d76c762a7 Mon Sep 17 00:00:00 2001
 4 From: Michael Forney <mforney@mforney.org>
 5 Date: Tue, 4 Jul 2023 18:57:02 -0700
 6 Subject: [PATCH] Break up long string literal
 7@@ -8,18 +8,18 @@ Subject: [PATCH] Break up long string literal
 8  1 file changed, 2 insertions(+)
 9 
10 diff --git a/bubblewrap.c b/bubblewrap.c
11-index 8322ea0..ceb4beb 100644
12+index f8728c7..d834618 100644
13 --- a/bubblewrap.c
14 +++ b/bubblewrap.c
15-@@ -339,6 +339,8 @@ usage (int ecode, FILE *out)
16+@@ -340,6 +340,8 @@ usage (int ecode, FILE *out)
17             "    --dev-bind-try SRC DEST      Equal to --dev-bind but ignores non-existent SRC\n"
18             "    --ro-bind SRC DEST           Bind mount the host path SRC readonly on DEST\n"
19             "    --ro-bind-try SRC DEST       Equal to --ro-bind but ignores non-existent SRC\n"
20 +           );
21 +  fprintf (out,
22+            "    --bind-fd FD DEST            Bind open directory or path fd on DEST\n"
23+            "    --ro-bind-fd FD DEST         Bind open directory or path fd read-only on DEST\n"
24             "    --remount-ro DEST            Remount DEST as readonly; does not recursively remount\n"
25-            "    --exec-label LABEL           Exec label for the sandbox\n"
26-            "    --file-label LABEL           File label for temporary sandbox content\n"
27 -- 
28-2.37.3
29+2.44.0
30 
R pkg/bubblewrap/patch/0004-Use-external-string-to-cap-function.patch => pkg/bubblewrap/patch/0003-Use-external-string-to-cap-function.patch
+12, -11
 1@@ -1,14 +1,14 @@
 2-From 1939348d3a1e8238464cd4c52743b04fa52ebed1 Mon Sep 17 00:00:00 2001
 3+From 0859d2570ddc7ff9ff5c7dc1309dea88eef2168a Mon Sep 17 00:00:00 2001
 4 From: Michael Forney <mforney@mforney.org>
 5 Date: Tue, 4 Jul 2023 19:20:51 -0700
 6 Subject: [PATCH] Use external string-to-cap function
 7 
 8 ---
 9- bubblewrap.c | 15 ++++++++++-----
10- 1 file changed, 10 insertions(+), 5 deletions(-)
11+ bubblewrap.c | 16 +++++++++++-----
12+ 1 file changed, 11 insertions(+), 5 deletions(-)
13 
14 diff --git a/bubblewrap.c b/bubblewrap.c
15-index 608009d..71c8bd0 100644
16+index d834618..bc53891 100644
17 --- a/bubblewrap.c
18 +++ b/bubblewrap.c
19 @@ -30,8 +30,8 @@
20@@ -21,17 +21,18 @@ index 608009d..71c8bd0 100644
21  #include <linux/sched.h>
22  #include <linux/seccomp.h>
23  #include <linux/filter.h>
24-@@ -44,6 +44,9 @@
25+@@ -44,6 +44,10 @@
26  #define CLONE_NEWCGROUP 0x02000000 /* New cgroup namespace */
27  #endif
28  
29 +int capset(void *, void *);
30 +int capget(void *, void *);
31 +int cap_from_name(const char *);
32- 
33++
34  /* We limit the size of a tmpfs to half the architecture's address space,
35   * to avoid hitting arbitrary limits in the kernel.
36-@@ -2358,7 +2361,7 @@ parse_args_recurse (int          *argcp,
37+  * For example, on at least one x86_64 machine, the actual limit seems to be
38+@@ -2604,7 +2608,7 @@ parse_args_recurse (int          *argcp,
39          }
40        else if (strcmp (arg, "--cap-add") == 0)
41          {
42@@ -40,7 +41,7 @@ index 608009d..71c8bd0 100644
43            if (argc < 2)
44              die ("--cap-add takes an argument");
45  
46-@@ -2370,7 +2373,8 @@ parse_args_recurse (int          *argcp,
47+@@ -2616,7 +2620,8 @@ parse_args_recurse (int          *argcp,
48              }
49            else
50              {
51@@ -50,7 +51,7 @@ index 608009d..71c8bd0 100644
52                  die ("unknown cap: %s", argv[1]);
53  
54                if (cap < 32)
55-@@ -2384,7 +2388,7 @@ parse_args_recurse (int          *argcp,
56+@@ -2630,7 +2635,7 @@ parse_args_recurse (int          *argcp,
57          }
58        else if (strcmp (arg, "--cap-drop") == 0)
59          {
60@@ -59,7 +60,7 @@ index 608009d..71c8bd0 100644
61            if (argc < 2)
62              die ("--cap-drop takes an argument");
63  
64-@@ -2396,7 +2400,8 @@ parse_args_recurse (int          *argcp,
65+@@ -2642,7 +2647,8 @@ parse_args_recurse (int          *argcp,
66              }
67            else
68              {
69@@ -70,5 +71,5 @@ index 608009d..71c8bd0 100644
70  
71                if (cap < 32)
72 -- 
73-2.37.3
74+2.44.0
75 
+238, -0
  1@@ -0,0 +1,238 @@
  2+From bbe8e2f75800633c251adbb34f7f9a1632a0d22a Mon Sep 17 00:00:00 2001
  3+From: Michael Forney <mforney@mforney.org>
  4+Date: Sun, 2 Feb 2025 01:34:54 -0800
  5+Subject: [PATCH] Revert "Handle EINTR when doing I/O on files or sockets"
  6+
  7+This reverts commit 0c9646573f140d415cf790310ed17c2ab89f64a3.
  8+---
  9+ bind-mount.c |  2 +-
 10+ bubblewrap.c | 26 +++++++++++++-------------
 11+ network.c    |  6 +++---
 12+ utils.c      | 16 ++++++++--------
 13+ 4 files changed, 25 insertions(+), 25 deletions(-)
 14+
 15+diff --git a/bind-mount.c b/bind-mount.c
 16+index a2e1ac6..c1aa9ce 100644
 17+--- a/bind-mount.c
 18++++ b/bind-mount.c
 19+@@ -405,7 +405,7 @@ bind_mount (int           proc_fd,
 20+   if (resolved_dest == NULL)
 21+     return BIND_MOUNT_ERROR_REALPATH_DEST;
 22+ 
 23+-  dest_fd = TEMP_FAILURE_RETRY (open (resolved_dest, O_PATH | O_CLOEXEC));
 24++  dest_fd = open (resolved_dest, O_PATH | O_CLOEXEC);
 25+   if (dest_fd < 0)
 26+     {
 27+       if (failing_path != NULL)
 28+diff --git a/bubblewrap.c b/bubblewrap.c
 29+index bc53891..4848713 100644
 30+--- a/bubblewrap.c
 31++++ b/bubblewrap.c
 32+@@ -608,7 +608,7 @@ do_init (int event_fd, pid_t initial_pid)
 33+ 
 34+   for (lock = lock_files; lock != NULL; lock = lock->next)
 35+     {
 36+-      int fd = TEMP_FAILURE_RETRY (open (lock->path, O_RDONLY | O_CLOEXEC));
 37++      int fd = open (lock->path, O_RDONLY | O_CLOEXEC);
 38+       if (fd == -1)
 39+         die_with_error ("Unable to open lock file %s", lock->path);
 40+ 
 41+@@ -619,7 +619,7 @@ do_init (int event_fd, pid_t initial_pid)
 42+         .l_len = 0
 43+       };
 44+ 
 45+-      if (TEMP_FAILURE_RETRY (fcntl (fd, F_SETLK, &l)) < 0)
 46++      if (fcntl (fd, F_SETLK, &l) < 0)
 47+         die_with_error ("Unable to lock file %s", lock->path);
 48+ 
 49+       /* Keep fd open to hang on to lock */
 50+@@ -636,7 +636,7 @@ do_init (int event_fd, pid_t initial_pid)
 51+       pid_t child;
 52+       int status;
 53+ 
 54+-      child = TEMP_FAILURE_RETRY (wait (&status));
 55++      child = wait (&status);
 56+       if (child == initial_pid)
 57+         {
 58+           initial_exit_status = propagate_exit_status (status);
 59+@@ -647,7 +647,7 @@ do_init (int event_fd, pid_t initial_pid)
 60+               int res UNUSED;
 61+ 
 62+               val = initial_exit_status + 1;
 63+-              res = TEMP_FAILURE_RETRY (write (event_fd, &val, 8));
 64++              res = write (event_fd, &val, 8);
 65+               /* Ignore res, if e.g. the parent died and closed event_fd
 66+                  we don't want to error out here */
 67+             }
 68+@@ -1071,10 +1071,10 @@ privileged_op (int         privileged_op_socket,
 69+       if (arg2 != NULL)
 70+         strcpy ((char *) buffer + arg2_offset, arg2);
 71+ 
 72+-      if (TEMP_FAILURE_RETRY (write (privileged_op_socket, buffer, buffer_size)) != (ssize_t)buffer_size)
 73++      if (write (privileged_op_socket, buffer, buffer_size) != (ssize_t)buffer_size)
 74+         die ("Can't write to privileged_op_socket");
 75+ 
 76+-      if (TEMP_FAILURE_RETRY (read (privileged_op_socket, buffer, 1)) != 1)
 77++      if (read (privileged_op_socket, buffer, 1) != 1)
 78+         die ("Can't read from privileged_op_socket");
 79+ 
 80+       return;
 81+@@ -2824,7 +2824,7 @@ namespace_ids_read (pid_t  pid)
 82+   NsInfo *info;
 83+ 
 84+   dir = xasprintf ("%d/ns", pid);
 85+-  ns_fd = TEMP_FAILURE_RETRY (openat (proc_fd, dir, O_PATH));
 86++  ns_fd = openat (proc_fd, dir, O_PATH);
 87+ 
 88+   if (ns_fd < 0)
 89+     die_with_error ("open /proc/%s/ns failed", dir);
 90+@@ -3046,7 +3046,7 @@ main (int    argc,
 91+ 
 92+   /* We need to read stuff from proc during the pivot_root dance, etc.
 93+      Lets keep a fd to it open */
 94+-  proc_fd = TEMP_FAILURE_RETRY (open ("/proc", O_PATH));
 95++  proc_fd = open ("/proc", O_PATH);
 96+   if (proc_fd == -1)
 97+     die_with_error ("Can't open /proc");
 98+ 
 99+@@ -3213,7 +3213,7 @@ main (int    argc,
100+ 
101+       /* Let child run now that the uid maps are set up */
102+       val = 1;
103+-      res = TEMP_FAILURE_RETRY (write (child_wait_fd, &val, 8));
104++      res = write (child_wait_fd, &val, 8);
105+       /* Ignore res, if e.g. the child died and closed child_wait_fd we don't want to error out here */
106+       close (child_wait_fd);
107+ 
108+@@ -3393,12 +3393,12 @@ main (int    argc,
109+               op = read_priv_sec_op (unpriv_socket, buffer, sizeof (buffer),
110+                                      &flags, &perms, &size_arg, &arg1, &arg2);
111+               privileged_op (-1, op, flags, perms, size_arg, arg1, arg2);
112+-              if (TEMP_FAILURE_RETRY (write (unpriv_socket, buffer, 1)) != 1)
113++              if (write (unpriv_socket, buffer, 1) != 1)
114+                 die ("Can't write to op_socket");
115+             }
116+           while (op != PRIV_SEP_OP_DONE);
117+ 
118+-          TEMP_FAILURE_RETRY (waitpid (child, &status, 0));
119++          waitpid (child, &status, 0);
120+           /* Continue post setup */
121+         }
122+     }
123+@@ -3422,7 +3422,7 @@ main (int    argc,
124+    * We're aiming to make /newroot the real root, and get rid of /oldroot. To do
125+    * that we need a temporary place to store it before we can unmount it.
126+    */
127+-  { cleanup_fd int oldrootfd = TEMP_FAILURE_RETRY (open ("/", O_DIRECTORY | O_RDONLY));
128++  { cleanup_fd int oldrootfd = open ("/", O_DIRECTORY | O_RDONLY);
129+     if (oldrootfd < 0)
130+       die_with_error ("can't open /");
131+     if (chdir ("/newroot") != 0)
132+@@ -3470,7 +3470,7 @@ main (int    argc,
133+         {
134+           cleanup_fd int sysctl_fd = -1;
135+ 
136+-          sysctl_fd = TEMP_FAILURE_RETRY (openat (proc_fd, "sys/user/max_user_namespaces", O_WRONLY));
137++          sysctl_fd = openat (proc_fd, "sys/user/max_user_namespaces", O_WRONLY);
138+ 
139+           if (sysctl_fd < 0)
140+             die_with_error ("cannot open /proc/sys/user/max_user_namespaces");
141+diff --git a/network.c b/network.c
142+index 373d606..f6d58a6 100644
143+--- a/network.c
144++++ b/network.c
145+@@ -53,8 +53,8 @@ rtnl_send_request (int              rtnl_fd,
146+   struct sockaddr_nl dst_addr = { AF_NETLINK, 0 };
147+   ssize_t sent;
148+ 
149+-  sent = TEMP_FAILURE_RETRY (sendto (rtnl_fd, (void *) header, header->nlmsg_len, 0,
150+-                                     (struct sockaddr *) &dst_addr, sizeof (dst_addr)));
151++  sent = sendto (rtnl_fd, (void *) header, header->nlmsg_len, 0,
152++                 (struct sockaddr *) &dst_addr, sizeof (dst_addr));
153+   if (sent < 0)
154+     return -1;
155+ 
156+@@ -71,7 +71,7 @@ rtnl_read_reply (int          rtnl_fd,
157+ 
158+   while (1)
159+     {
160+-      received = TEMP_FAILURE_RETRY (recv (rtnl_fd, buffer, sizeof (buffer), 0));
161++      received = recv (rtnl_fd, buffer, sizeof (buffer), 0);
162+       if (received < 0)
163+         return -1;
164+ 
165+diff --git a/utils.c b/utils.c
166+index 8ab89bb..ffe0a0d 100644
167+--- a/utils.c
168++++ b/utils.c
169+@@ -378,7 +378,7 @@ fdwalk (int proc_fd, int (*cb)(void *data,
170+   int res = 0;
171+   DIR *d;
172+ 
173+-  dfd = TEMP_FAILURE_RETRY (openat (proc_fd, "self/fd", O_DIRECTORY | O_RDONLY | O_NONBLOCK | O_CLOEXEC | O_NOCTTY));
174++  dfd = openat (proc_fd, "self/fd", O_DIRECTORY | O_RDONLY | O_NONBLOCK | O_CLOEXEC | O_NOCTTY);
175+   if (dfd == -1)
176+     return res;
177+ 
178+@@ -460,7 +460,7 @@ write_file_at (int         dfd,
179+   bool res;
180+   int errsv;
181+ 
182+-  fd = TEMP_FAILURE_RETRY (openat (dfd, path, O_RDWR | O_CLOEXEC, 0));
183++  fd = openat (dfd, path, O_RDWR | O_CLOEXEC, 0);
184+   if (fd == -1)
185+     return -1;
186+ 
187+@@ -485,7 +485,7 @@ create_file (const char *path,
188+   int res;
189+   int errsv;
190+ 
191+-  fd = TEMP_FAILURE_RETRY (creat (path, mode));
192++  fd = creat (path, mode);
193+   if (fd == -1)
194+     return -1;
195+ 
196+@@ -566,11 +566,11 @@ copy_file (const char *src_path,
197+   int res;
198+   int errsv;
199+ 
200+-  sfd = TEMP_FAILURE_RETRY (open (src_path, O_CLOEXEC | O_RDONLY));
201++  sfd = open (src_path, O_CLOEXEC | O_RDONLY);
202+   if (sfd == -1)
203+     return -1;
204+ 
205+-  dfd = TEMP_FAILURE_RETRY (creat (dst_path, mode));
206++  dfd = creat (dst_path, mode);
207+   if (dfd == -1)
208+     {
209+       errsv = errno;
210+@@ -647,7 +647,7 @@ load_file_at (int         dfd,
211+   char *data;
212+   int errsv;
213+ 
214+-  fd = TEMP_FAILURE_RETRY (openat (dfd, path, O_CLOEXEC | O_RDONLY));
215++  fd = openat (dfd, path, O_CLOEXEC | O_RDONLY);
216+   if (fd == -1)
217+     return NULL;
218+ 
219+@@ -777,7 +777,7 @@ send_pid_on_socket (int sockfd)
220+   cred.gid = getegid ();
221+   memcpy (CMSG_DATA (cmsg), &cred, sizeof (cred));
222+ 
223+-  if (TEMP_FAILURE_RETRY (sendmsg (sockfd, &msg, 0)) < 0)
224++  if (sendmsg (sockfd, &msg, 0) < 0)
225+     die_with_error ("Can't send pid");
226+ }
227+ 
228+@@ -807,7 +807,7 @@ read_pid_from_socket (int sockfd)
229+   msg.msg_control = control_buf_rcv;
230+   msg.msg_controllen = sizeof (control_buf_rcv);
231+ 
232+-  if (TEMP_FAILURE_RETRY (recvmsg (sockfd, &msg, 0)) < 0)
233++  if (recvmsg (sockfd, &msg, 0) < 0)
234+     die_with_error ("Can't read pid from socket");
235+ 
236+   if (msg.msg_controllen <= 0)
237+-- 
238+2.44.0
239+
R pkg/bubblewrap/patch/0003-Avoid-statement-expressions-for-TEMP_FAILURE_RETRY.patch => pkg/bubblewrap/patch/0005-Remove-unnecessary-TEMP_FAILURE_RETRY.patch
+35, -33
 1@@ -1,63 +1,65 @@
 2-From 095786df5a2eb12f7996a183a16912cbb8368105 Mon Sep 17 00:00:00 2001
 3+From cd531eb41821e239f3776295c5a2a4e14bbda2a7 Mon Sep 17 00:00:00 2001
 4 From: Michael Forney <mforney@mforney.org>
 5-Date: Tue, 4 Jul 2023 19:04:48 -0700
 6-Subject: [PATCH] Avoid statement expressions for TEMP_FAILURE_RETRY
 7+Date: Sun, 2 Feb 2025 01:40:38 -0800
 8+Subject: [PATCH] Remove unnecessary TEMP_FAILURE_RETRY
 9 
10+bwrap doesn't use signal handlers.
11 ---
12- bubblewrap.c | 19 ++++++++-----------
13- 1 file changed, 8 insertions(+), 11 deletions(-)
14+ bubblewrap.c | 6 +++---
15+ utils.h      | 9 ---------
16+ 2 files changed, 3 insertions(+), 12 deletions(-)
17 
18 diff --git a/bubblewrap.c b/bubblewrap.c
19-index ceb4beb..608009d 100644
20+index 4848713..c593436 100644
21 --- a/bubblewrap.c
22 +++ b/bubblewrap.c
23-@@ -44,14 +44,6 @@
24- #define CLONE_NEWCGROUP 0x02000000 /* New cgroup namespace */
25- #endif
26- 
27--#ifndef TEMP_FAILURE_RETRY
28--#define TEMP_FAILURE_RETRY(expression) \
29--  (__extension__                                                              \
30--    ({ long int __result;                                                     \
31--       do __result = (long int) (expression);                                 \
32--       while (__result == -1L && errno == EINTR);                             \
33--       __result; }))
34--#endif
35- 
36- /* We limit the size of a tmpfs to half the architecture's address space,
37-  * to avoid hitting arbitrary limits in the kernel.
38-@@ -467,7 +459,8 @@ report_child_exit_status (int exitc, int setup_finished_fd)
39+@@ -479,7 +479,7 @@ report_child_exit_status (int exitc, int setup_finished_fd)
40    if (opt_json_status_fd == -1 || setup_finished_fd == -1)
41      return;
42  
43 -  s = TEMP_FAILURE_RETRY (read (setup_finished_fd, data, sizeof data));
44-+  do s = read (setup_finished_fd, data, sizeof data);
45-+  while (s == -1 && errno == EINTR);
46++  s = read (setup_finished_fd, data, sizeof data);
47    if (s == -1 && errno != EAGAIN)
48      die_with_error ("read eventfd");
49    if (s != 1) // Is 0 if pipe closed before exec, is 2 if closed after exec.
50-@@ -2953,7 +2946,9 @@ main (int    argc,
51+@@ -3207,7 +3207,7 @@ main (int    argc,
52        if (opt_userns_block_fd != -1)
53          {
54            char b[1];
55 -          (void) TEMP_FAILURE_RETRY (read (opt_userns_block_fd, b, 1));
56-+          ssize_t s;
57-+          do s = read (opt_userns_block_fd, b, 1);
58-+          while (s == -1 && errno == EINTR);
59++          read (opt_userns_block_fd, b, 1);
60            close (opt_userns_block_fd);
61          }
62  
63-@@ -3238,7 +3233,9 @@ main (int    argc,
64+@@ -3505,7 +3505,7 @@ main (int    argc,
65    if (opt_block_fd != -1)
66      {
67        char b[1];
68 -      (void) TEMP_FAILURE_RETRY (read (opt_block_fd, b, 1));
69-+      ssize_t s;
70-+      do s = read (opt_block_fd, b, 1);
71-+      while (s == -1 && errno == EINTR);
72++      read (opt_block_fd, b, 1);
73        close (opt_block_fd);
74      }
75  
76+diff --git a/utils.h b/utils.h
77+index 079fe7c..bea4e9d 100644
78+--- a/utils.h
79++++ b/utils.h
80+@@ -43,15 +43,6 @@
81+ 
82+ #define N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0]))
83+ 
84+-#ifndef TEMP_FAILURE_RETRY
85+-#define TEMP_FAILURE_RETRY(expression) \
86+-  (__extension__                                                              \
87+-    ({ long int __result;                                                     \
88+-       do __result = (long int) (expression);                                 \
89+-       while (__result == -1L && errno == EINTR);                             \
90+-       __result; }))
91+-#endif
92+-
93+ #define PIPE_READ_END 0
94+ #define PIPE_WRITE_END 1
95+ 
96 -- 
97-2.37.3
98+2.44.0
99 
+1, -1
1@@ -1 +1 @@
2-Subproject commit 4ab175fe6d3a4053444b04d805a6d686f53455b9
3+Subproject commit 9ca3b05ec787acfb4b17bed37db5719fa777834f
+1, -1
1@@ -1 +1 @@
2-0.8.0 r0
3+0.11.0 r0