summaryrefslogtreecommitdiffstats
path: root/package/fakeroot/0002-communicate-check-return-status-of-msgrcv.patch
blob: 3bb4f9701f2a816334436a27635fe2c573f156fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
From a853f21633693f9eefc4949660253a5328d2d2f3 Mon Sep 17 00:00:00 2001
From: "Yann E. MORIN" <yann.morin.1998@free.fr>
Date: Sun, 13 Aug 2017 23:21:54 +0200
Subject: [PATCH 1/1] communicate: check return status of msgrcv()

msgrcv can return with -1 to indicate an error condition.
One such error is to have been interrupted by a signal.

Being interrupted by a signal is very rare in this code, except in a
very special condition: a highly-parallel (1000 jobs!) mksquashfs on
a filesystem with extended attributes, where we see errors like (those
are mksquashfs errors):
    llistxattr for titi/603/883 failed in read_attrs, because Unknown
    error 1716527536

See: https://bugs.busybox.net/show_bug.cgi?id=10141

In this case, we just have to retry the call to msgrcv().

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
---
 communicate.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/communicate.c b/communicate.c
index 293f404..787bb63 100644
--- a/communicate.c
+++ b/communicate.c
@@ -553,10 +553,13 @@ void send_get_fakem(struct fake_msg *buf)
       l=msgrcv(msg_get,
                (struct my_msgbuf*)buf,
                sizeof(*buf)-sizeof(buf->mtype),0,0);
-    while((buf->serial!=serial)||buf->pid!=pid);
+    while(((l==-1)&&(errno==EINTR))||(buf->serial!=serial)||buf->pid!=pid);
 
     semaphore_down();
 
+    if(l==-1)
+      buf->xattr.flags_rc=errno;
+
     /*
     (nah, may be wrong, due to allignment)
 
-- 
2.11.0

OpenPOWER on IntegriCloud